Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c_str() of an rvalue - unsafe?

Tags:

c++

Could anyone explain why the following crashes with an access violation at 0xFFFFFFFF at avformat_open_input?

std::string u8(const std::wstring& str)
{
    return boost::locale::conv::utf_to_utf<char>(str);
}

AVFormatContext* open_input(const std::wstring& filename)
{
    AVFormatContext* context = nullptr;
    avformat_open_input(&context, u8(filename).c_str(), nullptr, nullptr);
    avformat_find_stream_info(context, nullptr);
    return context;
}

while the following works:

AVFormatContext* open_input(const std::wstring& filename)
{
    auto u8filename = u8(filename);
    AVFormatContext* context = nullptr;
    avformat_open_input(&context, u8filename.c_str(), nullptr, nullptr);        
    avformat_find_stream_info(context, nullptr);
    return context;
}
like image 845
ronag Avatar asked Jan 31 '26 15:01

ronag


1 Answers

The result of u8(filename).c_str() should be usable until avformat_open_input returns. It's probably saving the pointer you give it and then using that during avformat_find_stream_info.

Post the docs for these avformat functions, or their implementations so we can see if it's actually doing that.


It doesn't look like avformat_open_input is doing anything wrong. Now I suspect that there's undefined behavior occurring somewhere earlier in the program. Try using a tool like valgrind or static analysis and see if that turns up anything.

like image 133
bames53 Avatar answered Feb 03 '26 04:02

bames53