在我的代码上下文中,什么是UndefinedBehaviorSanitizer

时间:2019-01-17 20:29:16

标签: c cs50

我试图从cs50中的pset2完成破解,并且在编译代码时没有引发任何错误,但是当我运行代码时却引发了某种错误。

我尝试消除代码的不同部分,发现消除所有的for循环后,错误不再显示

int main(int argc, string argv[])
{
    if (argc == 2)
    {
        printf("%s", crypt(argv[1], "hi"));
        string letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mess[1];
        int sl = strlen(letters);
        for (int x = 0; x < sl; x++)
        {
            mess[0][0] = letters[x];
            for (int y = 0; y < sl; y++)
            {
                mess[0][1] = letters[y];
                for (int z = 0; z < sl; z++)
                {
                    mess[0][2] = letters[z];
                    for (int a = 0; a < sl; a++)
                    {
                        mess[0][3] = letters[a];
                        for (int b = 0; b < sl; b++)
                        {
                            mess[0][4] = letters[b];
                            printf("%s", mess[0]);
                        }
                    }
                }
            }
        }
    }
    else
    {
        return 1;
    }
}

我希望遍历5个字母组合的每个可能组合,并输出这5个字母的字符串。相反,它会返回:

UndefinedBehaviorSanitizer:DEADLYSIGNAL
==665==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x000000402a60 (pc 0x000000428037 bp 0x7ffd0ab11070 sp 0x7ffd0ab10e60 T665)
==665==The signal is caused by a WRITE memory access.
    #0 0x428036 in main /root/sandbox/test.c:16:24
    #1 0x7f16d0022b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
    #2 0x402a89 in _start (/root/sandbox/test+0x402a89)

UndefinedBehaviorSanitizer can not provide additional info.
==665==ABORTING

我想知道此错误的含义,发生的原因以及以后如何避免该错误

2 个答案:

答案 0 :(得分:1)

在cs50中,kind: CronJob metadata: name: create-zip-upload spec: schedule: "27 5 * * *" # everyday at 05:27 AM concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: mycontainer image: 123456789.my.region.amazonaws.com/mycompany/myproject/rest:latest args: - /usr/bin/python3 - -m - scripts.createzip string的typedef。 char *的类型为mess[0],但从未初始化。您要么需要使用char *

分配空间
malloc

或者您可以使用mess[0] = malloc(somesize * sizeof *mess[0]); 数组:

char

还要注意,如果要使用char mess[1][somesize]; 打印mess,则必须以NUL终止。

答案 1 :(得分:0)

string mess[1];

string来自cs50,来自here,类型为char *

所以等于:

char *mess[1];

是一个元素的未初始化数组。元素类型是指向字符的指针。

mess[0][0] = ...

这是采用非初始化指针mess[0]并对其进行解引用和分配。 mess[0]未初始化,因此它是一个无效的指针,分配给mess[0][0]是无效的-那里没有有效的内存。没有要写入的内存。

您可以分配内存,即。

mess[0] = malloc(256 * sizeof(char));

即。将为256个字符(如果成功)分配内存,并返回指向该内存区域的指针。指针存储在数组mess的第一个成员中。然后mess[0]会指向只为您的程序分配的某个内存区域,有效区域为256个字符。