2017-04-14 10 views
0

나는 암호화 프로젝트를 진행 중이며 터미널에서 파일 이름을 가져 와서 암호화를 실행하는 간단한 테스트를하고 있습니다. 나는 다음과 같은 암호화 코드를 가지고 있지만 나는 다음과 같은 세그먼트 오류 얻을 :문자열 변환시 세그먼트 화 오류가 발생합니까?

문자열 일반 (reinterpret_cast :이 오류는 다음과 LOC 후 트리거 있음을 확인했다 gdb를 추적을 실행 한 후

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. 

을 (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

pread 직후에'filecontents [filelength-1] = '\ 0'; '시도하십시오. 단지 시험을 위해; 당신의'filecontents'가 제대로 종료되지 않았다고 가정합니다; 효과가 있다면 길이를 1만큼 수정해야합니다. –

+0

@NeilButterworth 그 .c 파일에는 이미 통합 한 openssl의'RC4_set_key()'와'RC4()'함수를 사용하기 위해 필요한 모든 의존성이 들어 있습니다. – Callat

답변

1

내가 주석으로이 떠날 것이다,하지만 충분하지 않습니다 평판.

파일의 크기는 얼마입니까? calloc가 실패하고 NULL을 반환 할 수 있습니까? 그것이 아니라고해도, calloc의 반환 값을 확인하는 것이 현명 할 수 있습니다. 또는 try/catch와 함께 new 연산자를 사용하십시오.

+0

파일은 짧지 만 6 바이트이지만 파일 시스템 프로젝트에 통합하기 전에 테스트 할 파일 범위가 있습니다. 6 바이트에서이 오류가 발생합니다. 나는 calloc의 반환 – Callat

+0

그걸로 시험해 볼께! 보행에 감사드립니다. – Callat