Skip to content

UB32⚓︎

Author: Yikai Cui

definition⚓︎

The program attempts to modify a string literal.

程序尝试修改字符串字面量。

description⚓︎

字符串字面量(string literal)是一个字符数组左值,对应存储空间中的一个字符数组对象。虽然C语言标准不规定该字符数组是一个常量,但语言标准明确定义尝试修改一个字符串字面量是一个未定义行为。

C语言标准不规定字符串字面量储存的位置,也不规定内容完全相同的字符串字面量是否应该共享同一个字符数组对象占据的内存空间。C语言标准通过将修改字符串字面量规定为未定义行为,不具体规定此种情况的结果,便于编译器自行决定关于字符串字面量的优化策略。

在大多数实现中,字符串字面量存储在只读内存区域,且同名字符串字面量共享同一地址,修改其值会导致段错误(segmentation fault)。在少部分实现中,字符串字面量存储在可读写内存区域,同名字符串字面量不共享同一对象,修改其值不会引发程序执行错误。

code⚓︎

UB32.c
# include <stdio.h>

int main()
{
    "We are happy."[0] = 'I';   //undefined behavior
    printf("We are happy.");
    return 0;
}

Configurations⚓︎

gcc version 4.9.2

Target: x86_64-w64-mingw32

MSVC _MSC_VER = 1928

Target: x86_64

Behaviors⚓︎

编译通过,程序运行时错误:段错误(segmentation fault)

编译通过,程序运行正常,输出:We are happy.