到达 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
但是,我已经研究了两个建议的解决方案,但找不到适合我的解决方案。
我不认为我的代码在堆栈中有太多变量。事实上,为了以防万一,我尝试使用函数 sha1()
注释掉,但同样的问题发生了。
我在使用前已经在我的代码中初始化了所有 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
同样,个人可以选择使用他们想要的任何形式
我正在编写代码来查找合适的输入,该输入将为 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
但是,我已经研究了两个建议的解决方案,但找不到适合我的解决方案。
我不认为我的代码在堆栈中有太多变量。事实上,为了以防万一,我尝试使用函数
sha1()
注释掉,但同样的问题发生了。我在使用前已经在我的代码中初始化了所有
char*
和std::string
。
仅供参考,我正在使用 g++
编译我的 C++ 代码。
任何正确方向的帮助或推动将不胜感激。
字符串文字在 C++ 中具有常量字符数组类型,任何修改字符串文字的尝试都会导致未定义的行为。您正在尝试至少在此语句中修改字符串文字:
strncpy(prefix, hashvalue.c_str(), 8);
您应该使用 std::string
.
注意这一点;例如这个 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
同样,个人可以选择使用他们想要的任何形式