DynamoRIO / DynamoRIO/drmemory

Potential false positives reported by Dr.Memory within Threading Building Blocks (Intel® TBB)

Open
#2,004 5 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
2.7k
Forks
290
PR merge metrics
No merged PRs in 30d

Description

Even when used on a toy example (from https://software.intel.com/en-us/node/506153):
___
```
#include "stdafx.h"

#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"

using namespace tbb;

struct Average
{
const float* input;
float* output;
void operator()(const blocked_range& range) const
{
for (int i = range.begin(); i != range.end(); ++i)
output[i] = (input[i - 1] + input[i] + input[i + 1])*(1 / 3.f);
}
};

// Note: Reads input[0..n] and writes output[1..n-1].
void ParallelAverage(float* output, const float* input, size_t n)
{
Average avg;
avg.input = input;
avg.output = output;
parallel_for(blocked_range(1, n), avg);
}

int main()
{
const float input[] = { 1.0, 2.0, 3.0 };
float output[] = { 0.0, 0.0, 0.0 };
size_t n = sizeof(output) / sizeof(float);

ParallelAverage(output, input, n);

return 0;
}
```
___
one gets the following report with **UNADDRESSABLE ACCESS beyond heap bounds** errors:
___
> **"\drmemory.exe" -debug -dr_debug -pause_at_assert -unaddr_only -no_summary -logdir "logs\drmemorylogs" -- "\.exe"**
```

~~Dr.M~~ Error #1: UNADDRESSABLE ACCESS beyond heap bounds: writing 0x000000e3284d08c5-0x000000e3284d08c6 1 byte(s)
~~Dr.M~~ # 0 tbb::task::task [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:569]
~~Dr.M~~ # 1 tbb::interface9::internal::flag_task::flag_task [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\partitioner.h:130]
~~Dr.M~~ # 2 tbb::interface9::internal::allocate_sibling [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:117]
~~Dr.M~~ # 3 tbb::interface9::internal::start_for<>::offer_work [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:106]
~~Dr.M~~ # 4 tbb::interface9::internal::partition_type_base<>::execute<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\partitioner.h:251]
~~Dr.M~~ # 5 tbb::interface9::internal::start_for<>::execute [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:127]
~~Dr.M~~ # 6 tbb.dll!tbb::internal::custom_scheduler<>::local_wait_for_all [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\custom_scheduler.h:501]
~~Dr.M~~ # 7 tbb.dll!tbb::internal::generic_scheduler::local_spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:676]
~~Dr.M~~ # 8 tbb.dll!tbb::internal::generic_scheduler::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:684]
~~Dr.M~~ # 9 tbb::task::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:749]
~~Dr.M~~ #10 tbb::interface9::internal::start_for<>::run [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:90]
~~Dr.M~~ #11 tbb::parallel_for<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:186]
~~Dr.M~~ #12 ParallelAverage [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:30]
~~Dr.M~~ #13 main [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:39]
~~Dr.M~~ Note: @0:00:01.049 in thread 6048
~~Dr.M~~ Note: next higher malloc: 0x000000e3284d08d0-0x000000e3284d08d0
~~Dr.M~~ Note: instruction: mov $0x01 -> 0x2d(%rax)
~~Dr.M~~
~~Dr.M~~ Error #2: UNADDRESSABLE ACCESS beyond heap bounds: reading 0x000000e3284d0898-0x000000e3284d08a0 8 byte(s)
~~Dr.M~~ # 0 tbb::task::set_parent [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:797]
~~Dr.M~~ # 1 tbb::interface9::internal::allocate_sibling [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:118]
~~Dr.M~~ # 2 tbb::interface9::internal::start_for<>::offer_work [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:106]
~~Dr.M~~ # 3 tbb::interface9::internal::partition_type_base<>::execute<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\partitioner.h:251]
~~Dr.M~~ # 4 tbb::interface9::internal::start_for<>::execute [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:127]
~~Dr.M~~ # 5 tbb.dll!tbb::internal::custom_scheduler<>::local_wait_for_all [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\custom_scheduler.h:501]
~~Dr.M~~ # 6 tbb.dll!tbb::internal::generic_scheduler::local_spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:676]
~~Dr.M~~ # 7 tbb.dll!tbb::internal::generic_scheduler::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:684]
~~Dr.M~~ # 8 tbb::task::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:749]
~~Dr.M~~ # 9 tbb::interface9::internal::start_for<>::run [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:90]
~~Dr.M~~ #10 tbb::parallel_for<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:186]
~~Dr.M~~ #11 ParallelAverage [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:30]
~~Dr.M~~ #12 main [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:39]
~~Dr.M~~ Note: @0:00:01.063 in thread 6048
~~Dr.M~~ Note: prev lower malloc: 0x000000e3284d0680-0x000000e3284d0888
~~Dr.M~~ Note: instruction: mov (%rax) -> %rax
Assertion !p || prefix().context == p->prefix().context failed on line 797 of file f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h
Detailed description: The tasks must be in the same context

~~Dr.M~~ WARNING: application exited with abnormal code 0xc0000005
```
___
Here is the log:
___
```
D_r. Memory version 1.11.0 build 2 built on Aug 29 2016 02:41:42
Dr. Memory results for pid 22152: "ConsoleApplication1.exe"
Application cmdline: "<...>.exe""
Recorded 115 suppression(s) from default C:\Program Files (x86)\Dr. Memory\bin64\suppress-default.txt

Error #1: UNADDRESSABLE ACCESS beyond heap bounds: writing 0x0000002c74de08c5-0x0000002c74de08c6 1 byte(s)
# 0 tbb::task::task [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:569]
# 1 tbb::interface9::internal::flag_task::flag_task [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\partitioner.h:130]
# 2 tbb::interface9::internal::allocate_sibling [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:117]
# 3 tbb::interface9::internal::start_for<>::offer_work [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:106]
# 4 tbb::interface9::internal::partition_type_base<>::execute<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\partitioner.h:251]
# 5 tbb::interface9::internal::start_for<>::execute [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:127]
# 6 tbb.dll!tbb::internal::custom_scheduler<>::local_wait_for_all [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\custom_scheduler.h:501]
# 7 tbb.dll!tbb::internal::generic_scheduler::local_spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:676]
# 8 tbb.dll!tbb::internal::generic_scheduler::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:684]
# 9 tbb::task::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:749]
#10 tbb::interface9::internal::start_for<>::run [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:90]
#11 tbb::parallel_for<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:186]
#12 ParallelAverage [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:30]
#13 main [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:39]
Note: @0:00:00.992 in thread 25840
Note: next higher malloc: 0x0000002c74de08d0-0x0000002c74de08d0
Note: instruction: mov $0x01 -> 0x2d(%rax)

Error #2: UNADDRESSABLE ACCESS beyond heap bounds: reading 0x0000002c74de0898-0x0000002c74de08a0 8 byte(s)
# 0 tbb::task::set_parent [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:797]
# 1 tbb::interface9::internal::allocate_sibling [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:118]
# 2 tbb::interface9::internal::start_for<>::offer_work [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:106]
# 3 tbb::interface9::internal::partition_type_base<>::execute<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\partitioner.h:251]
# 4 tbb::interface9::internal::start_for<>::execute [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:127]
# 5 tbb.dll!tbb::internal::custom_scheduler<>::local_wait_for_all [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\custom_scheduler.h:501]
# 6 tbb.dll!tbb::internal::generic_scheduler::local_spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:676]
# 7 tbb.dll!tbb::internal::generic_scheduler::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\externalprojects\source\ep-tbb\src\tbb\scheduler.cpp:684]
# 8 tbb::task::spawn_root_and_wait [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\task.h:749]
# 9 tbb::interface9::internal::start_for<>::run [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:90]
#10 tbb::parallel_for<> [f:\projects\matsdk_vs2015_64bit\branchmain\binaries\m\thirdparty\install\tbb-2017_u5-msvc14u3-x64\include\tbb\parallel_for.h:186]
#11 ParallelAverage [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:30]
#12 main [c:\users\akovalyov\documents\visual studio 2015\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp:39]
Note: @0:00:01.012 in thread 25840
Note: prev lower malloc: 0x0000002c74de0680-0x0000002c74de0888
Note: instruction: mov (%rax) -> %rax

___
FINAL SUMMARY:

DUPLICATE ERROR COUNTS:

SUPPRESSIONS USED:

ERRORS FOUND:
2 unique, 2 total unaddressable access(es)
0 unique, 0 total invalid heap argument(s)
0 unique, 0 total warning(s)
ERRORS IGNORED:
Details: <...>\results.txt
```
___

This is probably due to nonstandard functions, **NFS_Allocate()** and **NFS_Free()** (which do not seem to be among
_[o A call to malloc (or calloc or realloc, or Windows equivalents HeapAlloc or HeapReAlloc or the Local or Global versions) inside of a heap region](http://drmemory.org/docs/page_unaddr.html)_
tracked by _Dr. Memory_),
being used to allocate/free a padded (by **task_prefix_reservation_size** = **sizeof(task_prefix)** [bytes in front](https://github.com/jckarter/tbb/blob/master/include/tbb/task.h#L180) ) data structure, [**task**](https://github.com/jckarter/tbb/blob/master/include/tbb/task.h#L520) , in task& **[generic_scheduler::allocate_task()](https://github.com/jckarter/tbb/blob/master/src/tbb/scheduler.cpp#L352)**. As soon as we access the prefix memory (by invoking the **task::prefix()** method), _Dr. Memory_ complains about unaddressable access (see the stacks above).

I'm having trouble figuring out whether this is a real issue within _TBB_, or indeed a false positive reported due to current _Dr. Memory_ limitations; in the latter case, it may make sense to suppress them (e.g., by automatically putting them into **potential_errors.txt**) until _Dr. Memory_ learns to handle these calls correctly.

Your advice will be much appreciated!

-- Aleksey
18C '96

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.