gpt4 book ai didi

c++ - 意外的非 NULL 返回

转载 作者:可可西里 更新时间:2023-11-01 09:49:40 33 4
gpt4 key购买 nike

我正在玩 TagLib(在 Windows 上,使用 MingW 构建)。我试图让 TagLib 识别 MP3 文件中何时没有 ID3v1 或 ID3v2 信息。根据TagLib documentation ,当文件中没有 ID3v2 信息时,MPEG 文件对象中的 ID3v2Tag() 函数应返回 NULL 指针。

不幸的是,这并没有发生。我制作了一些我在代码中使用的测试 MP3 文件(我已经提供了这些文件):

  • blank.mp3 ( download ),根本没有 ID3v1 或 ID3v2 信息。我可以通过在文件二进制内容中对“TAG”和“ID3”进行纯文本搜索来确认这一点。
  • only_album_id3v2.mp3(download),有ID3v2信息(只设置专辑)
  • only_album_id3v1.mp3(download),有ID3v1信息(只设置专辑)

这是我的代码。

#include <iostream>

#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>

using namespace std;

int main()
{
cout << "Test." << endl;

TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");


TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();

cout << at->album() << endl;
cout << bt->album() << endl;
cout << ct->album() << endl;

cout << "The program is done.";

return 0;
}

由于 cout << at->album() << endl; 上的 NULL 指针错误,运行此程序应该中断,但它运行得很好。另外,当我 cout << ct << endl; , 它返回一个内存地址。

这是输出:

Test.

test album id3v2

The program is done.

编辑:这是一个新的测试。

#include <iostream>

#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>

using namespace std;

int main()
{
cout << "Test." << endl;

TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");


TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();

if(at == NULL)
{
cout << "at is NULL.";
}
else
{
cout << "at is not NULL.";
}
cout << endl;

if(bt == NULL)
{
cout << "bt is NULL.";
}
else
{
cout << "bt is not NULL.";
}
cout << endl;

if(ct == NULL)
{
cout << "ct is NULL.";
}
else
{
cout << "ct is not NULL.";
}
cout << endl;

cout << "The program is done.";

return 0;
}

这是输出。

Test.
at is not NULL.
bt is not NULL.
ct is not NULL.
The program is done.

最佳答案

我简要检查了 TagLib 的代码。

我对此一无所知,也从未使用过它,但代码对我来说看起来有问题。这就是为什么 -

在 MPEG::File::read() 中,我们正在寻找一个标签 - d->ID3v2Location = findID3v2();。如果不存在,则不会将其添加到标签 vector 中。这是检查 - if(d->ID3v2Location >= 0)

但是,在函数的末尾,就在返回之前,我们有 -

// Make sure that we have our default tag types available.
ID3v2Tag(true);
ID3v1Tag(true);

现在,带有 true 参数的 Id3v2Tag(create) 实际上调用了 return d->tag.access(ID3v2Index, create);。 access() 函数是 -

template <class T> T *access(int index, bool create)
{
if(!create || tag(index))
return static_cast<T *>(tag(index));

set(index, new T);
return static_cast<T *>(tag(index));
}

因此,当 create 为真时,我们将创建一个全新的空标签并将其放入 vector 中(使用 set() 函数)。

这意味着无论文件是否包含标签,它们都会添加到 vector 中。这不是记录在案的行为。看起来像一个错误。

我不知道为什么需要这两行 - 查看此文件的历史记录可能会提示添加它们的原因,但我没有这样做。

无论如何,我想强调的是,我从未真正执行过这段代码。这是基于纯粹静态地只读取非常小的部分,而没有意识到大规模问题。

我认为打开错误报告不会有什么坏处。

关于c++ - 意外的非 NULL 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404705/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com