QProcess не работает из-за strcat |
Здравствуйте, гость ( Вход | Регистрация )
QProcess не работает из-за strcat |
mva |
1.10.2013, 15:37
Сообщение
#1
|
Участник Группа: Участник Сообщений: 104 Регистрация: 15.3.2009 Из: Киров Пользователь №: 615 Спасибо сказали: 3 раз(а) Репутация: 0 |
Доброго времени суток!
Подключаю драйвер фискального регистратора к своему приложению просто включая его исходники в свои. Обнаружил, что у меня перестает работать запуск через QProcess стороннего приложения (браузера FireFox), никак не связанного с драйвером, из-за одной строки в коде драйвера. Раскрывающийся текст int readoptions (void) { char *homedir; int etc_res; int home_res; fr = drvfrInitialize(); homedir = getenv("HOME"); etc_res = readrcfile("/etc/drvfrrc"); home_res = readrcfile(strcat(homedir, "/.drvfrrc")); // Из-за присутствия strcat в этом месте, мое стороннее приложение не запускается if(etc_res == -1 && home_res == -1) return -1; fr->prop->ComPortNumber = t_devnum; fr->prop->Password = t_passwd; fr->prop->Timeout = t_timeout; fr->prop->BaudRate = t_linespeed; return 1; } Если я проблемную строку поменяю на такую: home_res = readrcfile(QString().append(homedir).append("/.drvfrrc").toAscii().data()); то стороннее приложение запускается нормально. С чем может быть связан такой эффект? |
|
|
Iron Bug |
1.10.2013, 16:56
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
дык, тут сразу две ошибки памяти. во-первых, перетирать строки, возвращённые getenv, нельзя. если хочешь оперировать с этими данными, копируй в свой локальный буфер. во-вторых, strcat не занимается перераспределением памяти и у строки в первом параметре должно хватить длины на всё содержимое, с присоединённым хвостом.
|
|
|
mva |
1.10.2013, 18:19
Сообщение
#3
|
Участник Группа: Участник Сообщений: 104 Регистрация: 15.3.2009 Из: Киров Пользователь №: 615 Спасибо сказали: 3 раз(а) Репутация: 0 |
Сделал в исходниках драйвера так
Раскрывающийся текст char buffer[1000]; ... homedir = getenv("HOME"); ... strcat(buffer, homedir); strcat(buffer, "/.drvfrrc"); home_res = readrcfile(buffer); ... и все нормально заработало. Iron Bug, спасибо. Драйвер не мой, а сам я плохо разбираюсь в С и С++. |
|
|
Текстовая версия | Сейчас: 23.11.2024, 6:39 |