问题标签 [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.
c++ - 我的 C++ 代码中的“#define __cdecl”是什么意思?
我正在使用 Visual Studio 开发一个现有的 c++ 项目,我发现几乎每个函数声明都__cdecl
在函数名称前加上一个,例如:void __cdecl functionName()
. 然后我跳转到__cdecl
位于winnt.h
文件中的 的定义:
我搜索了cdecl并得到它是 C 和 C++ 程序的默认调用约定,但上面的代码告诉我它__cdecl
什么都没有。那么为什么要__cdecl
在函数名称之前放置一个函数名,因为它什么都不是?还是我误解了上面的代码?
java - 在具有特定 c 调用约定 cdecl 的 java 中使用 C lib (dll)
我正在做一个项目,我有一些传感器,我希望它们通过 USB 连接到 PC。现在他们写了一个用c编写的windows lib,所有函数都使用c的cdecl调用约定,我必须确保如果我用其他语言(java!)编程,调用约定是给定的。
所以我研究了一下,发现了一些在java中绑定dll和或使用JNA的教程。但这对我来说都是新事物,我想确定它是可能的(也许是一个例子)-该设备并不便宜,我想在购买之前知道这一点。
assembly - 在汇编 x86 中交换两个 int 指针
我想交换两个 int 指针。
我可以像这样在C中做到这一点
现在我正在尝试在组装中进行,但是请耐心等待,我不明白为什么这不起作用
有人可以解释我做错了什么吗?
c - C语言中的Pascal和cdecl关键字
一个面试问题在我脑海中引起了强烈的困惑,即让我们看看这个程序
输出是
但为什么?如何?
你能简单地给我解释一下吗,因为我不明白 UGC 书中提到的这个程序。
请帮助我更好地理解这个概念,以便我更好地准备我的面试。
感谢您宝贵的时间。
assembly - 找出有多少字节将 esp 和程序堆栈上存储的返回地址分开
我很难找到答案。从我读到的 %ebp 有 32 位,将 %esp 移动到 %ebp 你仍然有 32 位,然后减去 70 到 32,其余的我不明白。我是新手,所以我不是很熟练。请给出详细的解释。谢谢!
以下是我遇到的问题。
在这一系列指令的末尾,有多少字节将 esp 和存储在程序堆栈上的返回地址分开?假设我们使用标准的 32 位 x86 调用约定调用此函数。
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 $esp
inswapMe
的值与打印c
与d
调用swapMe
. 由于swapMe
接受c
并d
作为参数,我希望在调用时在堆栈上看到相同的值,swapMe
但我没有。打印任何寄存器时我没有看到0xffffdb2c
或0x565556c0
一次。请澄清我在调用函数、传入参数或打印寄存器中的值时做错了什么。我对 x86 很陌生,所以我可能在某个地方犯了一个菜鸟错误。
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 的解决方案,我会非常高兴。
assembly - 无法理解调用者不需要清理堆栈的 cdecl 调用约定示例
我正在阅读IDA Pro Book。在第 86 页讨论调用约定时,作者展示了一个 cdecl 调用约定示例,它消除了调用者从堆栈中清除参数的需要。我正在复制下面的代码片段:
作者接着说
在上面的示例中,编译器在函数序言期间为 demo_cdecl 的参数预先分配了存储空间。
我将假设sub esp, 0x10
代码片段的顶部有一个。否则,您只会破坏堆栈。
他后来说,调用 demo_cdecl 完成时,调用者不需要调整堆栈。但可以肯定的是add esp, 0x10
,通话后必须有一个。
我到底错过了什么?
c - C中函数参数中__cdecl的用途是什么
我正在学习 C 语言,在学习的过程中我发现了一行代码,这对我来说是全新的和奇怪的,我
void PullDown(char **, int, void (__cdecl **)(void));
只知道第一个和第二个参数。我想知道第三个参数。__cdecl 之后的两个星号有什么用?我从这种语法中知道,(type_cast *)
所以它与类型转换有关?
c# - PInvoke 的意外调用约定
我在 dll 及其头文件中有一个库,我没有它的源代码。我需要使用 pinvoke 从 C# 调用此非托管代码,但在设置调用约定时遇到问题。头文件看起来像:
我认为 ConvertRVBtoK 调用约定必须是__cdecl
因为那是默认的 c/c++ 调用约定。但是,当我使用 undname.exe 实用程序检查修饰名称 ("?ConvertRVBtoK@@YGHPAEJJJ0E@Z") 时,结果显示__stdcall
为调用约定。为什么?dll文件和头文件有冲突吗?