防止字符串操作崩溃导致整个应用程序崩溃

ase*_*seq 1 c

我创建了一个程序,该程序定期从网站下载文本文件,该文件采用csv格式,并对其进行解析,提取相关数据,然后显示.

我注意到,偶尔,每隔几个月左右,它会崩溃.考虑到数据下载和解析的周期可以每5分钟甚至更短时间发生,因此崩溃很少见.我很确定它在解析字符串并提取数据的函数内崩溃.当它崩溃时,它发生在拥挤的互联网连接期间,即大量下载和/或慢速连接.有时,远程站点可能正在处理损坏或不完整的数据.

我使用了一个测试应用程序,它在处理之前保存要处理的数据,并且确实表明在发生崩溃时它没有完成.

我已经调整了该函数以适应大量无效或不完整数据的情况,以及检查所有返回值.我还检查用于连接到远程站点的各种函数的返回值并下载数据.当返回值表示没有成功时,不会更进一步.

该函数的核心使用strsep()来遍历数据并从中提取信息:

/ *
  * delimiters typically contains: <;>, <">, < >
  * strsep() is used to split part of the string using delimiter
  * and copy into token which then is copied into the array
  * normally the function stops way before ARRAYSIZE which is just a safeguard
  * it would normally stop when the end of file is reached, i.e. \0
  */
for(n=0;n<ARRAYSIZE;n++)
{
  token=strsep(&copy_of_downloaded_data, delimiters);
  if (token==NULL)
    break;

  data->array[n].example=strndup(token, strlen(token));

  if (data->array[n].example!=NULL)
  {
    token=strsep(&copy_of_downloaded_data, delimiters);
    if (token==NULL)
      break;

  (..)

  copy_of_downloaded_data=strchr(copy_of_downloaded_data,'\n'); /* find newline */
  if (copy_of_downloaded_data==NULL)
    break; 

  copy_of_downloaded_data=copy_of_downloaded_data+1;
  if (copy_of_downloaded_data=='\0') /* find end of text */
    break;
}
Run Code Online (Sandbox Code Playgroud)

由于我怀疑我无法解释数据可能被破坏的所有方式,我想知道是否有一种方法对此进行编程,因此运行时的函数不会在数据损坏的情况下使整个应用程序崩溃.

如果那是不可能的,我该怎么做才能使它更健壮.

编辑:崩溃的一个可能的实例是当数据突然结束时,字段的中间被切断,即

"测试","例子","这个数据很普遍

至少我通过查看保存的数据注意到了它,但我发现它不一致.将按照下面的建议对其进行压力测试.

Jer*_*ner 6

最好的办法是找出导致函数崩溃的输入,并修复函数以使其不会崩溃.由于该函数正在进行字符串处理,因此应该可以通过向其提供大量虚拟/测试数据(或者如果它是导致崩溃的特定输入而将"正确"测试数据提供给它)来实现.你基本上想要折磨测试这个功能,直到你发现如何让它按需崩溃; 此时,您可以开始调查崩溃的确切位置和原因,一旦您了解到,修复崩溃的必要更改可能会对您显而易见.

在valgrind下运行程序也可能会指出你的错误.

如果由于某种原因你无法修复bug,另一个选择是生成子进程并在子进程中运行有错误的代码.这样,如果它崩溃,只有子进程丢失而不是父进程.(您可以通过调用fork()在大多数操作系统下生成子进程;当然,您需要为子进程提供一些方法将其结果传递回父进程).(请注意,以这种方式执行此操作可能不是非常有效,并且如果有能力发送您的程序输入的恶意者可以找出如何操作错误的顺序,也可能会在您的应用程序中引入安全漏洞控制子进程 - 所以我不推荐这种方法!)