【问题标题】:What is a deprecated warning?什么是弃用警告?
【发布时间】:2021-11-25 14:11:23
【问题描述】:

我正在使用 c 和 libpcap 函数编写一个数据包嗅探器。以下是源代码。

 #include <pcap.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include "YYY.h"
 
 void pcap_fatal(const char *failed_in, const char *errbuf){
         printf("Fata Error in %s: %s\n", failed_in, errbuf);
         exit(1);
 }
  
 int main(){
         struct pcap_pkthdr header;
         const u_char *packet;
         char errbuf[PCAP_ERRBUF_SIZE];
         char *device;
         pcap_t *pcap_handle;
         int i;
 
 
         device = pcap_lookupdev(errbuf);
         if(device == NULL)
                 pcap_fatal("pcap_lookupdev", errbuf);
         printf("Sniffing of device %s\n", device);
 
         pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
 
         for(i=0;i<3;i++){
                 packet = pcap_next(pcap_handle, &header);
                 printf("Got a %d bute packet\n", header.len);
                 dump(packet, header.len);
         }
         
         pcap_close(pcap_handle);
 }

但是,当我尝试使用 gcc 编译它时,它会给出以下警告,如下所示。

libcap_sniff.c: In function ‘main’:
libcap_sniff.c:20:2: warning: ‘pcap_lookupdev’ is deprecated: use 'pcap_findalldevs' and use the first device [-Wdeprecated-declarations]
   20 |  device = pcap_lookupdev(errbuf);
      |  ^~~~~~
In file included from /usr/include/pcap.h:43,
                 from libcap_sniff.c:1:
/usr/include/pcap/pcap.h:394:16: note: declared here
  394 | PCAP_API char *pcap_lookupdev(char *)
      |                ^~~~~~~~~~~~~~

谁能帮我解决这个问题。我还不知道什么是弃用警告。

【问题讨论】:

  • 您是否阅读了警告信息?你有什么不明白的?
  • 该库的作者已标记该函数以警告您不应再使用该函数。所以一般来说你应该重新检查 API 看看是否有更好的选择。
  • 一般来说,这意味着提到的函数现在被认为是不安全的,并且建议使用另一个。
  • @Damien 弃用函数通常并不意味着弃用的函数是“不安全”。

标签: c pcap packet-sniffers sniffing


【解决方案1】:

使用pcap_findalldevs 而不是pcap_lookupdev

弃用软件意味着它可能可用,但被视为已过时,应避免使用。通常已弃用的软件已被替代软件替换。

GCC 具有标记功能已弃用的功能。当程序使用标记为已弃用的函数时,GCC 会警告您,以便您可以修改代码以使用更现代的函数。已弃用的功能可能会在它们所属的软件的未来版本中被删除。

这个documentation表示你可以使用pcap_findalldevs来执行pcap_lookupdev例程的功能。

【讨论】:

    【解决方案2】:

    gcc 有一个名为function attributes 的非标准扩展,它可以用于各种事情,例如在某个内存部分内联或声明函数。它们通过在函数声明之后(而不是在函数定义之后)写入__attribute__ (arg)来使用。

    其中一个属性称为deprecated,它告诉 gcc 向应用程序程序员发出警告,告知其调用了一个过时的函数。可选地,deprecated 可以被赋予一个消息参数。示例:

    #include <stdio.h>
    
    void foo (void) __attribute__((deprecated("consider using bar instead")));
    
    void foo (void)
    {
      puts("foo");
    }
    
    int main (void)
    {
      foo();
    }
    

    这给出了:

    warning: 'foo' is deprecated: consider using bar instead [-Wdeprecated-declarations]
    foo();

    默认情况下启用此警告。要关闭它,需要显式使用编译器选项-Wno-deprecated-declarations


    至于为什么不推荐使用您的特定功能,您必须查阅(缺少的)文档。 man 没有提到它被弃用的原因。

    【讨论】:

      【解决方案3】:

      注意:问题的开头是关于一般的警告。实际问题的正确答案在帖子后面。

      虽然标准只定义了#error 指令,但大多数常见的实现都接受非致命的#warning 指令。当在编译时可以检测到某事时,库编写者可以使用它们来引发错误或警告。

      这只是意味着来自 libpcap 的人不推荐使用pcap_lookupdev,并且很可能在以后的版本中被删除。他们只是警告他们库的用户停止在新代码中使用它。


      但这里涉及到不同的机制。 Gnu C 编译器(但可能是其他编译器)有一个特定的 attribute 来指示弃用。它旨在与特殊选项 -Wdeprecated-declarations 一起使用以打开弃用警告,并与 -Wno-deprecated-declaration 一起使用以将其关闭。

      【讨论】:

      • -Wdeprecated-declarations 是一个 gcc 选项。否则它会说“#warning text here”。所以我不明白这个答案与问题有什么关系?
      • @Lundin:看起来我应该有的时候没有写错误消息的结尾......
      • 但是,我做了一个man pcap_lookupdev,但完全没有帮助。没有说为什么它被弃用或应该使用什么。这是开源的普遍问题:不存在的文档。
      • @Lundin:文档并非不存在。存在证明在Hans Passant’s earlier comment 中,它链接到documentation,上面写着pcap_lookupdevpcap_findalldevs 替换。
      • @EricPostpischil 你是说linux.die.net/man/3/pcap_lookupdev 自 2017 年以来就没有更新过?我原以为它会直接从一些最新的 Linux 发行版中提取 man
      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多