user773797
user773797

Reputation: 1

memcpy(), segmentation fault when changing the value of a predefined variable

I wrote a program for handling command line inputs. I am having a segmentation error during memcpy() function when long strings are used as the input.

Here is the code:

int main(int argc, char * argv[])
{
    // initialize input variables
    char inputFileName[] = "sequence.txt"; //default input file name
    //check if a different file name is given
    for(int i = 0; i < argc-1; i++){ 
        if(string(argv[i])=="-i"){ 
            cerr << "string: " << string(argv[i+1]).c_str() << endl;
            cerr << "string size: " << string(argv[i+1]).size() << endl;
            inputFileName[string(argv[i+1]).size()]=0;
            cerr << "filename: " << inputFileName << endl;
            memcpy(inputFileName,string(argv[i+1]).c_str(),string(argv[i+1]).size());
            cerr << "filename after memcpy: " << inputFileName << endl;
            break;
        }
    }
}

When a short file name is given (-i sequence.fasta) it works properly:

$ ./Program -i sequence.fasta

string: sequence.fasta
string size: 14
filename: sequence.txt
filename after memcpy: sequence.fasta
filename final: sequence.fasta

However a long name causes a segmentation fault:

$ ./Program -i sequencesequencesequencesequencesequencesequencesequencesequencesequencesequence.fasta

string: sequencesequencesequencesequencesequencesequencesequencesequencesequencesequence.fasta
string size: 86
filename: sequence.txt
Segmentation fault: 11

Am I missing something? How should I handle memcpy()?

Upvotes: 0

Views: 544

Answers (2)

Vlad from Moscow
Vlad from Moscow

Reputation: 310990

Apart from that the size of array

char inputFileName[] = "sequence.txt"; 

is fixed and equal to 13 your code has another bug. When you execute memcpy

memcpy(inputFileName,string(argv[i+1]).c_str(),string(argv[i+1]).size());

then you do not copy the terminating zero because expression string(argv[i+1]).size()does not take it into account.

Upvotes: 0

marcinj
marcinj

Reputation: 49986

This is your problem:

  inputFileName[string(argv[i+1]).size()]=0;

inputFileName has predefined size equals to strlen("sequence.txt") + 1 == 12bytes + 1byte for '\0'

  char inputFileName[] = "sequence.txt"; //default input file name

so if you index it using string(argv[i+1]).size() then behaviour is undefined, if argv[i+1] is longer than 13.

You should use std::string, as a buffer

Upvotes: 1

Related Questions