【问题标题】:Best way to eliminate deprecated conversion from string constant to ‘char*’"消除从字符串常量到‘char*’的过时转换的最佳方法”
【发布时间】:2017-02-01 15:11:01
【问题描述】:

我遇到了如下情况,我收到了来自编译器的以下警告。

    Main.cpp:14:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
   Login(USER,PASSWORD);

这里是代码 密码.h

#define USER "user"
#define PASSWORD "pass"

Main.cpp

#include <iostream>
#include "Passwords.h"

using namespace std;

void Login(char* username,char* password)
{
  cout << "UserName is " << username <<endl;
  cout << "Password is " << password <<endl;
}

int main()
{
  Login(USER,PASSWORD);
  return 0;
}

我决定做的一件事是在 Passwords.h 文件中引入一个全局变量。但我真的很想知道解决这个问题的最佳做法是什么。

我希望没有人会在提出相同问题时将此标记为重复。我需要以合法的方式消除此警告并寻找最佳实践,因为同一问题的许多答案提供了一些技巧来关闭编译器警告和一些强制转换解决方案。

更新

Login 函数实际上是一个虚函数,因此参数数据类型不能从char * 更改为const char*。为简单起见,我使用了特定的代码段。

【问题讨论】:

  • 右侧第一个相关链接中得分最高(注意:不接受)的答案给出了可接受的解决方案:stackoverflow.com/questions/59670/… 这对您来说足够合法吗?
  • 使用std::string
  • @NathanOliver,不同意。这里不需要std::string,这将是一个额外的转换。
  • 使用连续数据存储密码很不安全,因为它不安全。所以char*std::string都是不合适的。
  • @Bathsheba 我希望你不要以此为基础来判断这个问题。

标签: c++ coding-style


【解决方案1】:

但我真的很想知道解决这个问题的最佳做法是什么。

最佳实践是在未对指向的对象/数组进行修改时使用指向 const 的指针/引用。您应该对参数进行以下更改:

void Login(const char* username, const char* password)

从字符串字面量到const char* 的转换格式正确且不被弃用。


参数数据类型不能从char *更改为const char*

您的要求不包括上述最佳做法。鉴于此限制,您不应将字符串文字传递给函数。剩下的选项是解决方法。我建议的解决方法是创建文字的本地副本,然后将其传递:

char user[] = USER;
char pass[] = PASSWORD;
Login(user,pass);

PS。从 C++11 开始,从字符串文字到 char* 的转换不仅被弃用,而且格式错误。符合当前标准的编译器可能会拒绝编译程序。

PPS。正如 cmets 中所指出的,从安全角度来看,将密码作为纯文本存储在可执行文件中(这是存储字符串文字的方式)是可疑的。

【讨论】:

  • 谢谢。这成功了。登录功能实际上并不是我使用它的上下文所显示的那样。
【解决方案2】:

鉴于您无法将函数签名更改为更合适的内容,因此您被卡住了。糟糕的代码会强制使用更多的糟糕代码。

在这种情况下,您需要将字符串复制到不是 const 的位置。

int main()
{
  char user[] = USER;
  char password[] = PASSWORD;
  Login(user,password);
  return 0;
}

【讨论】:

    【解决方案3】:

    做吧

    void Login(const char* username, const char* password)
    

    当您使用它时,将define 替换为constexpr

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多