Tag: undefined behavior

在ANSI C中foo(i ++)+ foo(i ++)是否未定义?

这是一个示例代码段: int i = 4,b; b = foo(i++) + foo(i++); 我很确定它不是未定义的,因为在调用foo之前有一个序列点。 但是,如果我使用-Wall标志编译代码,则会生成编译器警告, warning: operation on ‘i’ may be undefined 。 我意识到它may ,但我只想仔细检查一下我是否正确。

未经validation的scanf调用会导致未定义的行为吗?

以下片段是否在发生错误时调用未定义的行为? #include int main() { int i; /* Indeterminate */ if (scanf(“%d”, &i) == 1) /* Initialize */ printf(“%d\n”, i); /* Success! Print read value */ else printf(“%d\n”, i); /* Input failed! Is printing `i` UB or not? */ return 0; } 如果scanf失败怎么办?是否访问了未初始化的变量? 编辑 此外,如果我用my_initializer(&i)替换scanf(“%d”, &i) my_initializer(&i) : int my_initializer(int *pi) { double room_temp_degc = […]

释放分配给char *(由`malloc`分配)的int *是否会调用Undefined Behavior?

标题可能令人困惑。 假设str是malloc分配的指针。 类型为int* ptr被赋值给它并被释放,如下面的代码片段所示: char* str = malloc(64); int* ptr = str; free(ptr); 我试图编译上面的代码。 它只是发出警告: source_file.c: In function ‘main’: source_file.c:10:16: warning: initialization from incompatible pointer type int* ptr = str; ^ 上面的代码是否调用未定义的行为? 上面的代码片段是否释放了malloc为str分配的malloc ?

使用malloced内存未定义写入前读取?

根据这个reddit注释线程 ,如果在写入内存之前尝试读取内存,则它是未定义的。 我指的是正常的堆内存,它已成功地进行了malloc编辑。 …请注意,这不是严格有效的C:允许编译器/运行时系统使用所谓的陷阱表示来初始化未初始化的内存,这会导致访问时出现未定义的行为。 我觉得很难相信。 有标准报价吗? 当然,据我所知,无法保证内存已被清零。 这个未初始化的存储器中的值基本上是伪随机的或任意的。 但我真的不相信标准会将此称为未定义的行为 (从某种意义上说它可能是段错误,或者删除所有文件,或者其他什么)。 其余的reddit线程没有对此问题进行更多说明。

函数调用中参数的评估顺序?

我正在研究C中的未定义行为,并且我发表了一份声明 函数参数的评估没有特定的顺序 但那么像_cdecl和_stdcall这样的标准调用约定呢,其定义(在一本书中)表明参数是从右到左进行评估的。 现在我对这两个定义感到困惑,根据UB,状态与另一个定义不同,这是根据调用约定的定义。 请certificate两者合理。

在C / C ++中编写非打印字符的行为是什么?

如果字符是通过printf / fprintf编写的,那么编写非打印字符的行为是未定义的还是实现定义的? 我很困惑,因为C标准N1570 / 5.2.2中的单词仅涉及打印字符和字母转义序列的显示语义。 另外,如果字符是通过std::ostream (仅限C ++)编写的,该怎么办?

函数调用的序列点?

这是另一个序列点问题,但是一个相当简单的问题: #include void f(int p, int) { printf(“p: %d\n”, p); } int g(int* p) { *p = 42; return 0; } int main() { int p = 0; f(p, g(&p)); return 0; } 这是未定义的行为吗? 或者对g(&p)的调用是否作为序列点?

是否由于未定义的行为造成错位负载?

是否由于void*未定义的行为导致错位负载? 以下是我对Clang及其消毒剂的看法: bufhelp.h:146:29: runtime error: load of misaligned address 0x7fff04fdd0e1 for type ‘const uintptr_t’ (aka ‘const unsigned long’), which requires 8 byte alignment 0x7fff04fdd0e1: note: pointer points here 00 00 00 66 66 6f 6f 62 61 72 34 32 46 4f 4f 42 41 52 31 37 66 6f 6f 62 61 72 34 […]

如果没有明确的“返回”,则函数将返回什么

当我忘记编写函数的return子句时,我遇到了这个问题,但是gcc没有警告或错误。 我修复了它,但开始想知道为什么函数会在没有return情况下return 无意义的东西。 以下是我尝试过的一些例子: #include “stdio.h” #include “stdlib.h” int func1 () { int i; i = 2; } int func2 (int a) { int i = a+3; } int func3 () { int i; for (i = 0; i <= 1; i++); } int main(void) { int a = 0; int b = 0; int […]

如果getc()通过SIGINT退出,则可能在getc()之后的未定义行为会改变程序行为

在“未定义行为”的现代解释下,编译器有权假设不会发生导致未定义行为“不可避免”的事件链,并且可以消除仅在代码将要执行的情况下适用的代码。未定义的行为; 这可能会导致未定义行为的影响及时向后工作,并使原本可以观察到的行为无效。 另一方面,如果除非程序终止,否则未定义行为将是不可避免的,但程序在调用未定义行为之前可以并且确实终止,程序的行为将保持完全定义。 在做出此决定时,需要考虑编译器的原因是什么? 举几个例子: 在许多平台上,对“getc”之类的函数的调用通常会返回(至少最终),但在某些情况下,编译器无法控制。 如果有一个程序,如: int main(int argc, char *argv[]) { if (argc != 3) { printf(“Foo\n”); return 0; } else { int ch; printf(“You’d better type control-C!\n”); int ch = getc(); if (ch < 65) return (ch-33) / (argc-3); else return INT_MAX + ch; } } 如果在argc等于3的情况下调用程序,则会定义行为,但是SIGINT阻止了getc()调用的返回? 当然,如果getc()可以返回哪个值会导致定义的行为,那么在编译器可以确定不会接收到这样的输入之前,不会发生未定义的行为。 如果没有值getc()可以返回,这将避免未定义的行为,但是,如果阻止getc()返回任何值,整个程序是否仍然定义? getc()的返回值与调用未定义行为的操作之间是否存在因果关系会影响事物(在上面的示例中,编译器无法知道任何特定forms的未定义行为会在不知道输入的字符的情况下发生,但任何可能的输入都会触发某种forms)。 同样,如果在平台上存在地址,如果读取,则指定导致程序立即终止,编译器指定易失性读取将触发硬件读取请求,并且该平台上的某些外部库指定它将返回指针对于这样一个地址,这些因素是否意味着在这个单独的例子中bar的行为: int […]