我创建了一个程序,它定期从一个网站下载一个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;
}

由于我怀疑我无法解释数据损坏的所有方式,所以我想知道是否有方法对此进行编程,以便在数据损坏的情况下,函数在运行时不会使整个应用程序崩溃。
如果不可能的话,我能做些什么使它更健壮。
编辑:崩溃的一个可能实例是当数据突然结束时,字段的中间被剪切,即。
“test”,“example”,“这个数据是brok
至少我通过查看保存的数据发现了这一点,但是我发现它并不一致必须按以下建议进行压力测试。

最佳答案

最好的做法是找出是什么输入导致函数崩溃,并修复该函数,使其不会崩溃由于该函数正在进行字符串处理,因此应该可以通过向其提供大量虚拟/测试数据(或者如果是导致崩溃的特定输入,则向其提供“正确”的测试数据)来完成此操作。你基本上想折磨测试这个函数,直到你发现如何让它按需崩溃;在那一点上,你可以开始确切地调查它崩溃的位置和原因,一旦你理解了这一点,修复崩溃的必要更改可能会变得显而易见。
在valgrind下运行这个程序也可能会指向这个bug。
如果由于某种原因无法修复错误,则另一个选项是生成子进程并在子进程内运行错误代码。这样,如果它崩溃,只会丢失子进程,而不会丢失父进程(您可以通过调用fork()在大多数操作系统下生成子进程;当然,您需要想出一些方法让子进程将其结果传回父进程)(请注意,这样做是一种笨拙的做法,可能效率不高,而且如果有人能够向您发送程序输入的恶意程序能够找出如何操作错误以控制子进程,也可能会在您的应用程序中引入安全漏洞,所以我不建议使用这种方法!)

关于c - 防止字符串操作崩溃使整个应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29439870/

10-11 22:50
查看更多