问题标签 [cdecl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1771 浏览

c++ - 我的 C++ 代码中的“#define __cdecl”是什么意思?

我正在使用 Visual Studio 开发一个现有的 c++ 项目,我发现几乎每个函数声明都__cdecl在函数名称前加上一个,例如:void __cdecl functionName(). 然后我跳转到__cdecl位于winnt.h文件中的 的定义:

我搜索了cdecl并得到它是 C 和 C++ 程序的默认调用约定,但上面的代码告诉我它__cdecl什么都没有。那么为什么要__cdecl在函数名称之前放置一个函数名,因为它什么都不是?还是我误解了上面的代码?

0 投票
1 回答
356 浏览

java - 在具有特定 c 调用约定 cdecl 的 java 中使用 C lib (dll)

我正在做一个项目,我有一些传感器,我希望它们通过 USB 连接到 PC。现在他们写了一个用c编写的windows lib,所有函数都使用c的cdecl调用约定,我必须确保如果我用其他语言(java!)编程,调用约定是给定的。

所以我研究了一下,发现了一些在java中绑定dll和或使用JNA的教程。但这对我来说都是新事物,我想确定它是可能的(也许是一个例子)-该设备并不便宜,我想在购买之前知道这一点。

0 投票
2 回答
3187 浏览

assembly - 在汇编 x86 中交换两个 int 指针

我想交换两个 int 指针。

我可以像这样在C中做到这一点

现在我正在尝试在组装中进行,但是请耐心等待,我不明白为什么这不起作用

有人可以解释我做错了什么吗?

0 投票
1 回答
2235 浏览

c - C语言中的Pascal和cdecl关键字

一个面试问题在我脑海中引起了强烈的困惑,即让我们看看这个程序

输出是

但为什么?如何?

你能简单地给我解释一下吗,因为我不明白 UGC 书中提到的这个程序。

请帮助我更好地理解这个概念,以便我更好地准备我的面试。

感谢您宝贵的时间。

0 投票
1 回答
1181 浏览

assembly - 找出有多少字节将 esp 和程序堆栈上存储的返回地址分开

我很难找到答案。从我读到的 %ebp 有 32 位,将 %esp 移动到 %ebp 你仍然有 32 位,然后减去 70 到 32,其余的我不明白。我是新手,所以我不是很熟练。请给出详细的解释。谢谢!

以下是我遇到的问题。

在这一系列指令的末尾,有多少字节将 esp 和存储在程序堆栈上的返回地址分开?假设我们使用标准的 32 位 x86 调用约定调用此函数。

0 投票
0 回答
145 浏览

c - 将字符指针传递给外部 x86 32 位函数

我正在尝试编写一个小程序,它采用两个硬编码字符指针并使用位于 .S 文件中的外部 x86 32 位函数切换它们指向的内容。我正在使用基本的 gcc 编译器。这是我的 C 代码:

valSwap.c:

在运行swapMe(c, d)c 和 d 指向的字符串之前,已经很清楚了。运行后swapMe(c, d)我得到一个Segmentation Fault. 这是我的 swapMe 外部函数代码:

交换我.S:

现在由于 swapMe(c, d) 使用 cdecl 调用约定接收 2 个参数,我应该在堆栈中找到 c 和 d$esp+4$esp+8。我试图打印这些值以确认它们是我所期望的。它们不是我所期望的,或者我试图错误地打印它们:

我还尝试将 $eax 打印为字符串,因为我将 $esp+4 的内容移动到 $eax 中。

c我还在输入之前打印了和d之前的十六进制值,swapMe看看我是否至少得到了正确的值:

我还打印了一些其他可能相关的值:

我不明白为什么当我打印$eax, $edi, $ecx, and $espinswapMe的值与打印cd调用swapMe. 由于swapMe接受cd作为参数,我希望在调用时在堆栈上看到相同的值,swapMe但我没有。打印任何寄存器时我没有看到0xffffdb2c0x565556c0一次。请澄清我在调用函数、传入参数或打印寄存器中的值时做错了什么。我对 x86 很陌生,所以我可能在某个地方犯了一个菜鸟错误。

0 投票
1 回答
118 浏览

dll - 检查通过函数指针调用的函数是否有return语句

我们有一个插件系统,它通过 dlopening/LoadLibrarying dll/so/dylib 然后 dlsyming/GetProcAddressing 函数调用 dll(用户生成的插件)中的函数,然后将结果存储在函数指针中。

不幸的是,由于复制粘贴了一些错误的示例代码,这些 dll 中的一些没有正确的函数签名,并且不包含 return 语句。

一个 dll 可能包含以下内容:

或者它可能包含以下内容:

加载 dll 的应用程序依赖于返回值,但是有大量没有返回语句的 dll。我正在尝试检测这种情况,并警告用户他的插件存在问题。

这个天真的代码应该解释我想要做什么:

不幸的是,这不起作用,金丝雀在调用具有已知缺陷的 dll 后包含一个随机值。我天真地假设调用一个没有返回语句的函数会使金丝雀完好无损,但事实并非如此。

我的下一个想法是编写一点内联汇编程序来调用该函数,并在返回时检查 eax 寄存器,但 Visual Studio 2015 不再允许在 x64 代码中使用 __asm()。

我知道没有符合标准的解决方案,因为将函数指针转换为错误的类型当然是未定义的行为。但是,如果有人有一个至少可以在 64 位 Windows 上使用 Visual C++ 的解决方案,或者一个可以在 MacOS 上使用 clang 的解决方案,我会非常高兴。

0 投票
2 回答
945 浏览

assembly - 无法理解调用者不需要清理堆栈的 cdecl 调用约定示例

我正在阅读IDA Pro Book。在第 86 页讨论调用约定时,作者展示了一个 cdecl 调用约定示例,它消除了调用者从堆栈中清除参数的需要。我正在复制下面的代码片段:

作者接着说

在上面的示例中,编译器在函数序言期间为 demo_cdecl 的参数预先分配了存储空间。

我将假设sub esp, 0x10代码片段的顶部有一个。否则,您只会破坏堆栈。

他后来说,调用 demo_cdecl 完成时,调用者不需要调整堆栈。但可以肯定的是add esp, 0x10,通话后必须有一个。

我到底错过了什么?

0 投票
4 回答
3366 浏览

c - C中函数参数中__cdecl的用途是什么

我正在学习 C 语言,在学习的过程中我发现了一行代码,这对我来说是全新的和奇怪的,我 void PullDown(char **, int, void (__cdecl **)(void)); 只知道第一个和第二个参数。我想知道第三个参数。__cdecl 之后的两个星号有什么用?我从这种语法中知道,(type_cast *)所以它与类型转换有关?

0 投票
1 回答
117 浏览

c# - PInvoke 的意外调用约定

我在 dll 及其头文件中有一个库,我没有它的源代码。我需要使用 pinvoke 从 C# 调用此非托管代码,但在设置调用约定时遇到问题。头文件看起来像:

我认为 ConvertRVBtoK 调用约定必须是__cdecl因为那是默认的 c/c++ 调用约定。但是,当我使用 undname.exe 实用程序检查修饰名称 ("?ConvertRVBtoK@@YGHPAEJJJ0E@Z") 时,结果显示__stdcall为调用约定。为什么?dll文件和头文件有冲突吗?