在下面的代码中,我memset()是一个stdbool.h bool值变量123.(也许这是未定义的行为?)然后我将指向此变量的指针传递给受害者函数,该函数尝试使用条件操作来防止意外值.但是,由于某种原因,GCC似乎完全取消了条件操作.
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void victim(bool* foo)
{
int bar = *foo ? 1 : 0;
printf("%d\n", bar);
}
int main()
{
bool x;
bool *foo = &x;
memset(foo, 123, sizeof(bool));
victim(foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
user@host:~$ gcc -Wall -O0 test.c user@host:~$ ./a.out 123
使这个特别恼人的是该victim()函数实际上在库中,如果值大于1则会崩溃.
转载于GCC版本4.8.2-19ubuntu1和4.7.2-5.没有在clang上复制.
#include<stdio.h>
void main(){
printf("%f\n",5/9); // prints 0.000000
printf("%f\n",9.0/5.0); // prints 1.800000
printf("%f\n",5/9); // prints 1.799999
}
Run Code Online (Sandbox Code Playgroud)
第 5 行值应像第 3 行一样打印 0.000000
我在本地机器和在线编译器中尝试过,结果是相同的
通过评论我的回答启发这里.
这一系列步骤在C标准(C11)中是否合法?
void*void*或者相当于代码:
void foo(void) { ... }
void bar(void) { ... }
typedef void (*voidfunc)(void);
voidfunc array[] = {foo, bar}; // Step 1
void *ptr1 = array; // Step 2
void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3
voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4
Run Code Online (Sandbox Code Playgroud)
我认为这是允许的,因为实际的函数指针只能通过正确键入的指针访问.但Andrew Henle指出,标准部分6.3.2.3似乎没有涵盖这一点:指针.
我的任务是通过蓝牙从Android设备连接到运行nanoPB的设备.
我知道NonoPB处理诸如枚举之类的证据......如果它们通过,NanoPB可以处理枚举吗?或者失败,任何Protobuf模式如"Lite"允许他们进行通信.