到达 main 之前的分段错误 - C++

Segmentation Fault before reaching main - C++

我正在编写代码来查找合适的输入,该输入将为 SHA-1 哈希函数生成特定的输出。

我 运行 遇到的问题是我的代码引发了分段错误,但是 gdb 发现它在输入 main() 和执行任何之前引发了以下错误其他代码:

Program received signal SIGSEGV, Segmentation fault.
__strncpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:636
636 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.

这是我的代码:

#include <iostream>
#include <cstdlib>
#include <cstring>

#include "sha1.hpp"

int main() {
    char *prefix = "SHA1sha1";
    char *suffix = "chicken and beer";
    std::string hashvalue = "nonzero";
    char *line = "just some dummy string";
    int loop_number = 0;

    while (hashvalue.c_str()[0] != '0' || hashvalue.c_str()[1] != '0') {
        // change prefix
        strncpy(prefix, hashvalue.c_str(), 8);
        // hash the concatenated string of prefix and suffix
        strncpy(line, prefix, 8);
        strncat(line, suffix, strlen(suffix));
        hashvalue = sha1(line);

        loop_number++;
        if (loop_number % 1000 == 0) std::cout << loop_number << "th loop, hash value: " << hashvalue << std::endl;
    }

    std::cout << "Found prefix: " << prefix << " with hash value: " << hashvalue << std::endl;

    return 0;
}

sha1.hpp不是我实现的,而是取自这里:http://www.zedwood.com/article/cpp-sha1-function

虽然我已将 sha1.h 更改为 sha1.hpp,但这可能不是导致分段错误的原因。

现在我已经尝试使用错误消息和关键字 "segmentation fault before main" 来寻找这个问题的解决方案,而这个 post 似乎正在经历类似的问题:Segmentation Fault before main

但是,我已经研究了两个建议的解决方案,但找不到适合我的解决方案。

  1. 我不认为我的代码在堆栈中有太多变量。事实上,为了以防万一,我尝试使用函数 sha1() 注释掉,但同样的问题发生了。

  2. 我在使用前已经在我的代码中初始化了所有 char*std::string

仅供参考,我正在使用 g++ 编译我的 C++ 代码。

任何正确方向的帮助或推动将不胜感激。

字符串文字在 C++ 中具有常量字符数组类型,任何修改字符串文字的尝试都会导致未定义的行为。您正在尝试至少在此语句中修改字符串文字:

strncpy(prefix, hashvalue.c_str(), 8);

您应该使用 std::string.

类型的字符数组或 objects 而不是字符串文字

注意这一点;例如这个 if 语句

while (hashvalue.c_str()[0] != '0' || hashvalue.c_str()[1] != '0') {

可以写得更简单:

while (hashvalue[0] != '0' || hashvalue[1] != '0') {

尽管条件似乎没有意义。也许你的意思是以下

while ( hashvalue.size() > 1 ) {

您还需要包括 header <string>

#include <string>

您正在修改不可变内容。

// change prefix
strncpy(prefix, hashvalue.c_str(), 8);
// hash the concatenated string of prefix and suffix
strncpy(line, prefix, 8);
strncat(line, suffix, strlen(suffix)); 

尝试如下更改声明。

char prefix[100] = "SHA1sha1";
char suffix[200] = "chicken and beer";
char line[200] = "just some dummy string

另外,我猜

while (hashvalue.c_str()[0] != '0' || hashvalue.c_str()[1] != '0') {

应该是

while (hashvalue.c_str()[0] != '0' && hashvalue.c_str()[1] != '0') {

更新:

德摩根定律指出,

not (A and B) = not A or not B

同样,个人可以选择使用他们想要的任何形式