该程序的目的是通过测试它与前 11 个素数整数的整除性来确定 1 到 1000 之间的数是否为素数。该程序在大多数输入下都能正常运行。但是,当我输入一个整数(例如468)时,会检测到stack smashing。什么是堆栈粉碎以及如何解决此问题?

我曾尝试研究堆栈粉碎,但找不到与我的程序相关的具体示例。我不知道我可以尝试修改程序的替代方法,因为我对 C 编程比较陌生。

char divStatement[] = " is divisible by ";

if ((userInput % 31) == 0) {
    div31 = true;
    strcat(divStatement, "31, ");
}

if (div2 || div3 || div5 || div7 || div11 || div13 || div17 || div19 || div23 || div29 || div31) {
        divStatement[strlen(divStatement) - 2] = '.';
        divStatement[strlen(divStatement) - 1] = '\n';
        printf("%d%s", userInput, divStatement);
        printf("%d is not prime.\n", userInput);
}
else {
        printf("%d is prime.\n", userInput);
}

输出实际上工作正常。然而,在程序结束时,终端输出:
***stack smashing detected ***: ./a.out terminated
Aborted

最佳答案

char divStatement[] = " is divisible by ";

if ((userInput % 31) == 0) {
    div31 = true;
    strcat(divStatement, "31, ");
}
divStatement 是一个足够大的字符数组,足以容纳 " is divisible by " 加上一个 \0 终止符。您不能将 "31, " 附加到它,因为它没有任何额外的空闲空间。

一个简单的解决方法是为数组提供一个显式长度,该长度足以处理您的程序可能附加的任何内容。
char divStatement[1000] = " is divisible by ";

关于c - 什么是堆栈粉碎以及如何修复它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58015373/

10-11 21:00