Сегфо в Атои (ул.) - PullRequest
       12

Сегфо в Атои (ул.)

3 голосов
/ 20 декабря 2009

Я новичок в игре C / C ++, поэтому я предполагаю, что совершаю ошибку новичка:

int main(){
  char* clen;
  clen = getenv("CONTENT_LENGTH");
  if (clen==NULL){
    cout << "No such ENV var: CONTENT_LENGTH"<<endl;
    exit(0);
  }
  int cl = 0; 
  cl = atoi(clen);
  if (cl < 1){
    return inputPage();
  }

  // if there is no content, we assume that this is a fresh request, 
//   so we showed the input page, otherwise, we'll return dispatch to 
  //the processing code.
  postTest(clen);

}

Это должен быть скрипт CGI. Насколько я могу судить по GDB, операторам печати и т. Д., Этот код не работает в строке "cl = atoi (clen);" Я понятия не имею, почему это так. K & R предполагает, что это правильно. Я в основном скопировал эту строку из полудюжины других онлайн-уроков. И, кажется, работал прошлой ночью! Я в полном недоумении.

Ответы [ 4 ]

2 голосов
/ 20 декабря 2009

Я не верю, что это действительно вылетает на atoi ()

Не могли бы вы попробовать этот код?

#include <iostream>
#include <stdlib.h>
#ifndef NULL
#define NULL 0
#endif

using namespace std;

int main(){
  char* clen;
  clen = getenv("CONTENT_LENGTH");
  if (clen==NULL){
    cout << "No such ENV var: CONTENT_LENGTH"<<endl;
    exit(0);
  }
  int cl = 0;
  cl = atoi(clen);
  if (cl < 1){
                    std::cout << "return inputPage();" << std::endl;
                    return 0;
  }

    std::cout << "postTest();" << std::endl;

}

скомпилируйте его, например. «приложить» и запустить его с некоторыми вариантами CONTENT_LENGTH, например

./app
CONTENT_LENGTH=4 ./app
CONTENT_LENGTH=-4 ./app
CONTENT_LENGTH=a ./app
1 голос
/ 20 декабря 2009

Запрещающие ошибки компилятора и ошибочная реализация getenv () Я бы сказал, что для этого кода невозможно segfault на cl = atoi(clen). Это потому, что getenv () возвращает либо NULL, либо действительный указатель на массив символов с нулевым символом в конце (это просто причудливый способ сказать строку C).

Поскольку проверяется случай NULL, скорее всего, программа (это не «скрипт») аварийно завершает работу где-то еще.

РЕДАКТИРОВАТЬ : Откуда вы знаете, что он даже падает? Отображается ли ошибка HTTP 500? Если да, скорее всего, вы просто забыли cout << "Content-type: text/html\n\n". Что говорят логи веб-сервера?

EDIT2 : не имеет отношения к вашей проблеме, но обычно с использованием функций C, таких как atoi(), не одобряется; версия C ++ lexical_cast (реализована в TR1 и boost) является предпочтительной.

0 голосов
/ 22 декабря 2009

Оказывается, это никоим образом не было проблемой с atoi или с C ++ в целом. Проблема заключалась в том, что я забыл очень простой пункт CGI, который заключается в том, что в GET нет CONTENT_LENGTH, что неизбежно является первым вызовом браузера. Таким образом, я пытался возиться с ключом, который был нулевым. Мне просто нужно было вернуть inputPage, как только я обнаружил, что атрибут CONTENT_LENGTH отсутствует.

0 голосов
/ 20 декабря 2009

Ты пишешь, что смотришь на это с помощью GDB. Разве нельзя было просто копать (шагать) вызов функции atoi (), чтобы лучше понять, что происходит? Я полагаю, вы убедились, что он никогда не достигнет строки после вызова atoi ()?

...