1

我正在尝试创建一个函数来使用 C++ 中的 try and catch 方法获取用户名。不幸的是,这段代码不起作用,我的应用程序在尝试运行时关闭。

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;
}
4

1 回答 1

4

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++ 和指针。

于 2015-07-10T11:45:34.390 回答