c 相关问题

C是一种通用编程语言,用于系统编程(OS和嵌入式),库,游戏和跨平台。此标记应与有关C语言的一般问题一起使用,如ISO 9899标准(最新版本,9899:2018,除非另有说明)中所定义 - 也使用c89,c99,c11等标记特定于版本的请求。 C与C ++不同,它不应该在没有合理理由的情况下与C ++标签结合使用。

int_leastX_t 与 intX_t 有区别吗?

int8_t、int16_t、int32_t 和 int64_t 是有符号整数类型,宽度分别为 8、16、32 和 64 位 没有填充位并使用 2 的补码表示负值 (提供于...

c
回答 1 投票 0

-O 和 -wrap 的行为

我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #包括 我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> void * __wrap_malloc(size_t sz) { printf("Called %s", __func__); return (void *) 0xDEADBEEF; } int main() { void *ptr; ptr = malloc(10); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } 使用优化时 ❯ gcc -Os -Wl,-wrap=malloc 1.c -o opt ❯ ./opt opt: 1.c:16: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 12546 abort ./opt 未经优化 ❯ gcc -Wl,-wrap=malloc 1.c -o without_opt ❯ ./without_opt Called __wrap_malloc 我尝试反汇编可执行文件 优化 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: b9 20 06 40 00 mov $0x400620,%ecx 400459: ba 10 00 00 00 mov $0x10,%edx 40045e: be ea 05 40 00 mov $0x4005ea,%esi 400463: bf ee 05 40 00 mov $0x4005ee,%edi 400468: e8 d3 ff ff ff callq 400440 <__assert_fail@plt> 40046d: 0f 1f 00 nopl (%rax) 未经优化 000000000040053e <main>: 40053e: 55 push %rbp 40053f: 48 89 e5 mov %rsp,%rbp 400542: 48 83 ec 10 sub $0x10,%rsp 400546: bf 0a 00 00 00 mov $0xa,%edi 40054b: e8 c7 ff ff ff callq 400517 <__wrap_malloc> 400550: 48 89 45 f8 mov %rax,-0x8(%rbp) 400554: 48 8b 45 f8 mov -0x8(%rbp),%rax 400558: 3d ef be ad de cmp $0xdeadbeef,%eax 40055d: 74 19 je 400578 <main+0x3a> 40055f: b9 4e 06 40 00 mov $0x40064e,%ecx 400564: ba 10 00 00 00 mov $0x10,%edx 400569: be 0a 06 40 00 mov $0x40060a,%esi 40056e: bf 10 06 40 00 mov $0x400610,%edi 400573: e8 c8 fe ff ff callq 400440 <__assert_fail@plt> 400578: b8 00 00 00 00 mov $0x0,%eax 40057d: c9 leaveq 40057e: c3 retq 40057f: 90 nop 没有调用wrap_malloc。看起来已经优化了。然后我尝试添加打印语句 int main() { void *ptr; ptr = malloc(10); >> printf("0x%x\n", (uintptr_t)ptr); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } ❯ gcc -Os -Wl,-wrap=malloc 1.c -o print_opt ❯ ./print_opt Called __wrap_malloc0xdeadbeef print_opt: 1.c:17: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 31575 abort ./print_opt 现在我看到包装的函数被调用。但断言失败了 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: bf 0a 00 00 00 mov $0xa,%edi 400459: e8 f9 00 00 00 callq 400557 <__wrap_malloc> 40045e: bf 0a 06 40 00 mov $0x40060a,%edi 400463: 48 89 c6 mov %rax,%rsi 400466: 31 c0 xor %eax,%eax 400468: e8 c3 ff ff ff callq 400430 <printf@plt> 40046d: b9 48 06 40 00 mov $0x400648,%ecx 400472: ba 11 00 00 00 mov $0x11,%edx 400477: be 10 06 40 00 mov $0x400610,%esi 40047c: bf 14 06 40 00 mov $0x400614,%edi 400481: e8 ba ff ff ff callq 400440 <__assert_fail@plt> 400486: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 40048d: 00 00 00 有人可以帮助我理解为什么/如何看到这种行为吗?预先感谢 对于 gcc,malloc() 被视为所谓的 “内置”函数,优化器会意识到并专门处理它(例如,它可以对其返回值做出某些假设,这会导致它自动失败)断言而不需要对其进行运行时测试)。如果您将 -fno-builtin-malloc 添加到编译选项中,则该特殊处理将被禁用: $ gcc -Os -fno-builtin-malloc -Wl,-wrap=malloc 1.c -o opt $ ./opt Called __wrap_malloc

回答 1 投票 0

AF_PACKET 套接字在 Linux 中如何工作?

我正在尝试为 Linux 编写一个 C 嗅探器,并了解嗅探时内核中发生的操作。 我无法找到以下问题的答案: 如果我初始化我的...

回答 1 投票 0

仅当将值与 TRUE 进行比较时,操作警告中 xxx 和 bool 的不安全混合

我有一个用 C 实现的库(C89 兼容)。它定义了布尔数据类型 bool32。它还定义了布尔文字 TRUE 和 FALSE: #ifndef 真 # 定义 TRUE (0 == 0) #万一 #

回答 1 投票 0

如何处理SSL_accept上的SSL_ERROR_SSL

我使用 openssl(开发库,)用 C 语言编写一个小型、简单的服务器。由于我只在本地测试它,所以我使用自签名证书。第一次连接时,...

回答 1 投票 0

-某些编译器中的 Wint-in-bool-context 警告问题

我收到警告: 警告:'<<' in boolean context, did you mean '<' ? [-Wint-in-bool-context] for the code similar to the following: int a=7, b=3; int index = ((a << 1) || b...

回答 2 投票 0

MPLAB X32 编译器和将函数移至 RAM 会导致链接器错误

我正在使用 Microchips XC32 C 编译器和工具为 SAM E70 处理器构建可执行文件。 我必须创建一个从 RAM 而不是 ROM/Flash 执行的函数,因为该函数使用特殊...

回答 1 投票 0

“...重新声明为不同种类的符号”?

#包括 #包括 双集成F(双低,双高) { 双低 = 0; 双高 = 20; 双 delta_x=0; 双 x,ans; 双 s = 1/2*...

回答 7 投票 0

在我的 C raylib 项目中,发生了一些奇怪的事情

在这段代码中,狗的本意是“吃”骨头,但骨头并没有被吃掉,而是狗远离了骨头!我觉得这个游戏在欺骗我。 #include“raylib.h” #我...

回答 1 投票 0

-> 和 之间的区别。在结构中?

如果我有一个类似的结构 结构帐户 { int 账户号码; }; 那么这样做有什么区别 myAccount.account_number; 和 我的账户->账户号码; 或者没有什么不同...

回答 8 投票 0

c - 错误:尝试使用 SDL_CreateWindow 时,“const”之前的预期表达式

我正在尝试使用此处找到的文档使用 SDL2 的最新版本创建一个窗口,但有两个我似乎无法解决的错误,标题中的一个以及一个非常令人困惑的错误。 缅因州...

回答 1 投票 0

以“return”结尾的块后面的“else”有什么意义

块后面有“else”有什么好处吗 以“返回”结束,或者只是出于习惯 int foo (int a) { 如果(a==0) { 返回假; } 别的 ...

回答 1 投票 0

C语言中这是什么原因

#包括 int main() { 整数x、y、z; x = y = z = -1; z = ++x && ++y && ++z; printf("x = %d y = %d z = %d “,x,y,z); 返回0; } 我...

c
回答 1 投票 0

如何通过关闭 C 中的所有文件描述符来重新启动或启动进程

我想干净地重新启动我的过程。所以我尝试调用execv()。 看起来效果很好。但是,它使套接字和文件保持打开状态。 有没有办法重新启动(此)进程并关闭所有文件/so...

回答 1 投票 0

为什么在使用 scanf 读取 C 中的字符串作为输入时出现类型错误?

int main(){ 字符重复='y'; 浮动答案; 字符运算[6] = "1 + 4"; 做{ printf("以格式 输入您的操作: &...

回答 1 投票 0

OpenSSL:使用他们自己的示例程序来自 www.openssl.org 的意外 EOF

在Windows 10机器上,我通过vcpkg设置了一个OpenSSL 3.3项目,并编译了他们在https://github.com/openssl/openssl/blob/master/demos/guide/tls提供的示例程序-客户端块....

回答 1 投票 0

如何在没有外部库的情况下用C/C++绘制图形?

我正在尝试找出如何在没有任何外部库的情况下用 C/C++ 绘制图形。我知道这是可能的,因为我很确定这些库是用 C 或 C++ 编程的,我想知道......

回答 2 投票 0

尝试用 clang 静态链接 libc,ldd 显示动态链接?

我想编译一个带有静态链接的系统库(例如 libc)和动态链接的所有其他自定义库(例如 openssl)的 C 程序。当我编译“Hello World&q...

回答 1 投票 0

vscode中两个h文件需要互相调用的问题如何解决

两个.h文件互相调用,导致编译失败 在stack_tree.h中,我需要使用TreeNode*,但它是在tree.h中定义的,所以我尝试包含“tree.h”,就像下面的c...

回答 2 投票 0

如何使用 Zig ABI 处理 C 中的 Zig 错误集

我想从c调用zig函数,但fn返回类型是错误联合!void或MyType.Error!u32 如何处理错误? 假设我们有以下 lib.zig pub fn errorProneFunction(

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.