为什么“分段故障(核心转储)”?

时间:2014-07-19 19:01:56

标签: c segmentation-fault

好的,我知道当程序试图访问不允许访问的内存位置时会发生分段错误。所以,我检查了我的代码以查看是否存在问题,但在我看来,它能够访问所有必需的内存位置,那么为什么会出错?

这就是我所做的:

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "aes.h"
#include <string.h>
#define CCHMAXPATH 100

void encrypt(const char *fileIn, const char *fileOut, const unsigned char *key);

int main(int argc, char *argv[]) 
{
  unsigned char key[100];
  char buffer[CCHMAXPATH];
  int i;
  srand(time(NULL));

  for (i=0; i<argc; i++)
    printf("%d:  %s\n", i, argv[i]);

  aes_init();
  snprintf(key,100,"/home/ankita/bin/python/project/encrypt/%s.encrypted", argv[1]);
  encrypt(argv[1], key, argv[2]);

  return 0;
 }

 void encrypt(const char *fileIn, const char *fileOut,const unsigned char *key)
 {
   int i;
   aes_encrypt_ctx ctx[1];
   unsigned char iv[16]; /* initialisation vector */
   unsigned char inBuffer[200], outBuffer[200];
   FILE *inFile = fopen(fileIn,"rb");
   FILE *outFile = fopen(fileOut, "wb");

   /* pick a random initialisation vector */
   for(i = 0; i < 16; ++i)
      iv[i] = rand() & 0xFF;
   fwrite(iv, 1, 16, outFile);

   aes_encrypt_key256(key, ctx);
   while((i = fread(inBuffer, 1, sizeof(inBuffer), inFile)) > 0) 
   {
     aes_ofb_crypt(inBuffer, outBuffer, i, iv, ctx);
     fwrite(outBuffer, 1, i, outFile);
   }
   aes_ofb_crypt(inBuffer, outBuffer, i, iv, ctx);
   fwrite(outBuffer, 1, i, outFile);

   fclose(inFile);
   fclose(outFile);
   } 

现在这是命令行发生的事情:

$./amaze /home/ubuntu/Documents/txt/2mb.txt abc
0:  ./amaze
1:  /home/ubuntu/Documents/txt/2mb.txt
2:  abc
Segmentation fault (core dumped)

所以,就像我说的那样,我使用'进行'循环检查,正如预期的那样, argv [1] 是文件路径以及文件名, argv [2] 是关键。那有什么不对?内存的哪一部分无法访问?为什么我仍然会收到“Segmentation fault(core dumped)”?

1 个答案:

答案 0 :(得分:1)

首先,你对参数名称感到困惑。您将输出文件名放在名为key的变量中,并将key作为fileOut的{​​{1}}参数传递,并将encrypt()传递为argv[2]参数。这种混乱不会破坏事情,但应该修复。

此外,您通过key调用粘贴整个绝对路径“/home/ubuntu/Documents/txt/2mb.txt”,导致snprintf包含key,这几乎是当然不是你的意图。可能是您的"/home/ankita/bin/python/project/encrypt//home/ubuntu/Documents/txt/2mb.txt.encrypted"来电失败并返回fopen(fileOut, "rb"),但您没有查看。

你正在使用NULL key,这可能需要256位密钥素材,但是你传入的aes_encrypt_key256只能保证有效的4个字节({{1} }})。该函数试图从关键参数中拉出32个字节。