2017-04-14 30 views
0

我正在开发一个加密项目,我正在做一个简单的测试,它从终端获取一个文件名并运行我的加密。我有以下的加密代码,但我得到以下分段错误:字符串转换中的分段错误?

串平原(reinterpret_cast的:

terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_M_construct null not valid<br><br> 
Program received signal SIGABRT, Aborted. 
0x00007ffff74ab428 in __GI_raise ([email protected]=6) 
    at ../sysdeps/unix/sysv/linux/raise.c:54 
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. 

运行使用gdb一丝我已经证实,这种故障是以下LOC后触发后(fileContents),fileLength);下面

我的主函数调用这一段代码:

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string> 
#include <fstream> 
#include <limits> 
#include <sstream> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include "rc4_enc.c" 
#include "rc4_skey.c" 

using namespace std; 
void foo(int); 

int main(int argc, char * argv[]){ 
    if(argc!=2){ 
     cout << "Please enter the filename that you want to encrypt or decrypt\n"; 
     exit(2); 
    } 
    int fd; 
    fd = open(argv[1], O_RDONLY); 
    cout << "The file descriptor is " << fd << endl; 
    //close(fd);// Can I modify it if it's closed? 
    foo(fd); 

    return 0; 
} 

而且功能如下:

void foo(int fd) { 

    int fileLength = lseek(fd, 0, SEEK_END); 
    unsigned char* fileContents; 
    fileContents = (unsigned char*) calloc(fileLength, sizeof(char)); 
    pread(fd, fileContents, fileLength, 0); 
    string plain(reinterpret_cast<char*>(fileContents), fileLength); // Segfault happens here. But why? 
     RC4_KEY key; 
     int length = plain.size(); 
     unsigned char *buf = (unsigned char*)malloc(length+1); 
     memset(buf, 0, length+1); 

     ifstream pass; 
     pass.open("pass.txt"); 
     if(!pass.good()){ 
      return; 
     } 
     else{ 
      string password; 
      getline(pass,password); 
      RC4_set_key(&key, password.length(), (const unsigned char*)password.c_str()); 
     } 
     RC4(&key, length, (const unsigned char*)plain.c_str(), buf); 
     string result((char*)buf, length); 
     free(buf); 
     const char *outputBuf = result.c_str(); 
     pwrite(fd, outputBuf, result.length(), 0); 
     ftruncate(fd, result.length()); 
    } 
+1

你为什么#包括.c文件? –

+1

尝试'filecontents [filelength-1] ='\ 0';'在pread之后;只是一个尝试;我想你的'filecontents'没有正确终止。如果它有效,你还必须修正长度为1。 –

+0

@NeilButterworth那些.c文件包含所有必需的依赖关系使用'RC4_set_key()'&'RC4()'从OpenSSL的,我已经集成功能。 – Callat

回答

1

我将离开这个作为一个评论,但没有足够的声誉。

多大的文件? Calloc会失败并返回NULL? 即使不是这样,检查calloc的返回值可能是明智的。或者用try/catch来使用新的操作符。

+0

该文件很短,6字节,但我有一个文件的范围来测试它之前,我将它集成到我的文件系统项目。这在6个字节上出错。我会研究calloc的回报 – Callat

+0

是的,就是这样!感谢演练。 – Callat