Я пытаюсь создать функцию для получения имени пользователя, используя метод try and catch в C ++. К сожалению, этот код не работает, и мое приложение закрывается при попытке запуска.
QString UserInfo::getFullUserName()
{
DBG_ENTERFUNC(getFullUserName);
QString result;
qDebug("trying to get the username");
try
{
struct passwd fullUserData=*getpwnam(getUserName().toLatin1());
result = fullUserData.pw_gecos;
// it is the first of the comma seperated records that contain the user name
result = result.split(",").first();
if (result.isEmpty())
{
result = getUserName();
}
}
catch (...)
{
qDebug("exception caught");
}
qDebug() << result;
#endif
DBG_EXITFUNC;
return result;
}
Проблема возникает в этой строке кода, так как я поместил распечатки после нее, которые никогда не достигаются.
struct passwd fullUserData=*getpwnam(getUserName().toLatin1());
Кто-нибудь знает в чем здесь проблема?
*Редактировать———
Вот моя функция getUserName ()
QString UserInfo::GetUserName()
{
DBG_ENTERFUNC(GetUserName);
QString result;
foreach (QString environmentEntry, QProcess::systemEnvironment())
{
QString varName = environmentEntry.section('=',0,0);
QString varValue = environmentEntry.section('=',1,1);
if (varName == "USER" || varName == "USERNAME")
{
result = varValue;
}
}
DBG_EXITFUNC;
return result;
}
getpwnam()
возвращается NULL
когда имя пользователя не было найдено. Вы потенциально разыменовываете NULL
указатель.
*getpwnam(getUserName().toLatin1());
// ^ potential NULL pointer deref
Всегда проверяйте перед указанием потенциально недопустимого указателя:
struct passwd *fullUserData = getpwnam(getUserName().toLatin1());
// ^ note pointer
if (fullUserData != NULL) {
result = fullUserData->pw_gecos;
// ^^ fullUserData is a struct pointer
} else {
// throw Exception
}
Если вас это смущает, вы можете прочитать о C ++ и указателях.