Sunshine_1 0 / 0 / 0 Регистрация: 16.09.2020 Сообщений: 3 |
||||||||
1 |
||||||||
16.09.2020, 08:27. Показов 9891. Ответов 12 Метки нет (Все метки)
Код для решения СЛАУ методом Гаусса. Вроде как компилируется однако не дает финальные значения, относя все ошибки к изначальной матрице.
0 |
687 / 393 / 201 Регистрация: 19.12.2016 Сообщений: 1,599 |
|
16.09.2020, 08:30 |
2 |
j <= n Попробуйте удалить «=»
0 |
0 / 0 / 0 Регистрация: 16.09.2020 Сообщений: 3 |
|
16.09.2020, 08:42 [ТС] |
3 |
Тогда он не дает записать все переменные Добавлено через 4 минуты
0 |
ram876 687 / 393 / 201 Регистрация: 19.12.2016 Сообщений: 1,599 |
||||
16.09.2020, 08:48 |
4 |
|||
Я написал от балды простую программы и у меня все переменные проходит
0 |
0 / 0 / 0 Регистрация: 16.09.2020 Сообщений: 3 |
|
16.09.2020, 08:59 [ТС] |
5 |
Массив у вас статичный, n=5
0 |
ram876 687 / 393 / 201 Регистрация: 19.12.2016 Сообщений: 1,599 |
||||
16.09.2020, 09:27 |
6 |
|||
Присвоение пользователем или перед компиляцией не имеет значение и не вижу проблем от динамического выделения
0 |
mathway 17 / 10 / 6 Регистрация: 15.09.2020 Сообщений: 39 |
||||
16.09.2020, 09:46 |
7 |
|||
Что значит вроде как компилируется? Можно узнать сообщение компилятора о результате компиляции? Помимо всего прочего, в конце функции
вы удаляете лишь динамически выделенные массивы указателей, но не массивы, на которых они ссылаются. В данном примере это не имеет особого значения, ибо после выполнения программы все потребляемые ей ресурсы освобождаются для их дальнейшего использования другими программами,в том числе и выделенные динамически(в куче).
0 |
TheCalligrapher Вездепух 10913 / 5909 / 1614 Регистрация: 18.10.2014 Сообщений: 14,851 |
||||
16.09.2020, 09:56 |
8 |
|||
Вроде как компилируется однако не дает финальные значения, относя все ошибки к изначальной матрице. Ничего не понял. «Вроде как компилируется» и «компилятор все равно жалуется» — это взаимоисключающие утверждения. Что это значит???
Проблемный кусок кода
Почему вы решили, что это «проблемный кусок кода»? Я что-то не вижу тут никаких проблем.
0 |
687 / 393 / 201 Регистрация: 19.12.2016 Сообщений: 1,599 |
|
16.09.2020, 10:00 |
9 |
никаких проблем
j <= n Разве тут не выход за пределы?
0 |
Вездепух 10913 / 5909 / 1614 Регистрация: 18.10.2014 Сообщений: 14,851 |
|
16.09.2020, 10:02 |
10 |
Разве тут не выход за пределы? С чего бы это вдруг? Память выделена для прямоугольного массива размера
1 |
687 / 393 / 201 Регистрация: 19.12.2016 Сообщений: 1,599 |
|
16.09.2020, 10:05 |
11 |
m = n + 1 не заметил, спасибо.
0 |
17 / 10 / 6 Регистрация: 15.09.2020 Сообщений: 39 |
|
16.09.2020, 10:37 |
12 |
Пожалуйста, предоставьте сообщение о компиляции этого исходника. Также укажите сам компилятор и его версию. И да, с чего вы решили, что проблема именно в прикреплённом вами куске кода?
0 |
0 / 0 / 0 Регистрация: 17.09.2020 Сообщений: 1 |
|
17.09.2020, 05:54 |
13 |
Извиняюсь, почта была утеряна Компилирует- в том смысле что проходит сборка и он выдает адекватные числа в матрице значений однако ответ выдает неверный Добавлено через 6 минут Я пишу на VS 2019 (предположу что последней версии ибо устанавливал недавно).
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
17.09.2020, 05:54 |
Помогаю со студенческими работами здесь Выводит ошибку на строке StudentA student = new Student («Динар», «19», «Е09-31»);В чем причина? Ругается на строку Student student = new Student («Динар», «19», «Е09-31»); В чём причина? Построить функцию которая возвращает текст «not defined»(«Не определено») при недопустимых значениях х Написать программу проверки правильности написания сочетаний «жи», «ши», «ча», «ща», «чу», «щу». Исправить ошибки Причина ошибки «Unable to write data to the transport connection» Setlocale(LC_CTYPE,»Russian») -причина ошибки printf ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 13 |
I seem to get an erroneous warning message from Visual Studio 2019 (16.5 Preview but also in 16.4 and earlier) Code Analysis tool. Is this a bug, or am I really just missing something?
The warning generated (exactly) is:
warning C6385: Reading invalid data from ‘prodlist’: the readable size is ‘(size_t)*32+8′ bytes, but ’64’ bytes may be read.
Here’s the code which generates the warning (as minimal as possible)
#include <cstdint>
#include <string>
#include <iostream>
struct Product {
std::string price_profile;
};
int getNumRows() {
return 5;
}
Product *getProductsFromDB( int &numelements ) {
numelements = 0;
const int num_rows = getNumRows();
if ( num_rows == 0 ) {
numelements = 0;
return nullptr;
}
Product *prodlist = new Product[num_rows];
for ( int i = 0; i < num_rows; ++i ) {
prodlist[i].price_profile = "test"; // Warning on this line
}
numelements = num_rows;
return prodlist;
}
int main() {
int num_rows;
Product *prodlist = getProductsFromDB( num_rows );
for ( int i = 0; i < num_rows; ++i ) {
std::cout << prodlist[i].price_profile;
}
getchar();
}
If I change the price_profile
to an int
(and its corresponding value), or if I change num_rows
to a constant (like 5
) then the warning goes away.
asked Jan 8, 2020 at 16:04
ChrisMMChrisMM
8,44013 gold badges29 silver badges48 bronze badges
3
It seems in Visual Studio 2019 Microsoft is enforcing SAL analysis rules on C and C++ code by default, even though there are still plenty of false positives like your case here.
One thing you can do for now is disable the warning giving a false positive:
#pragma warning(push)
#pragma warning(disable:6385)
Product *getProductsFromDB( int &numelements ) {
...
}
#pragma warning(pop)
answered Jan 8, 2020 at 16:26
Govind ParmarGovind Parmar
20.5k7 gold badges53 silver badges85 bronze badges
3
I get this warning if I try to use function geti() in the following code.
Warning C6385 Reading invalid data from 'snapPts': the readable size is '((geti()+1))*sizeof(DPoint3d)' bytes, but '48' bytes may be read.
But If I use integer like
int i
directly then I am not able to get the warning. I am unable to understand the scenario that what’s happening there, I googled it much but couldn’t find the solution. I am new to c++, please pardon me for spell mistake and please help me to understand this.
Note: I am building the code with «Microsoft Mixed(C++/CLR) Recommended Rules.
I am using the following code
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <corecrt_wstring.h>
int geti() {
return 2;
}
struct DPoint3d
{
//! x coordinate
double x;
//! y coordinate
double y;
//! z coordinate
double z;
};
int main(array<System::String ^> ^args)
{
int i = 2;
if (i > 1) {
DPoint3d* snapPts = (DPoint3d *)_alloca((geti() + 1) * sizeof(DPoint3d));
DPoint3d* snapPts2 = new DPoint3d();
*snapPts2 = snapPts[1];
}
return 0;
}
A great answer is really appreciated.
Thanks
Permalink
Cannot retrieve contributors at this time
title | description | ms.date | f1_keywords | helpviewer_keywords | ms.assetid | |||
---|---|---|---|---|---|---|---|---|
Warning C6385 |
Describes C++ Code Analysis warning C6385 and how to resolve it. |
03/16/2020 |
|
C6385 |
3e4961e7-0f09-42a8-8cc2-151109dfdbda |
Warning C6385
Invalid data: accessing buffer-name, the readable size is size1 bytes, but size2 bytes may be read: Lines: x, y
Remarks
The readable extent of the buffer might be smaller than the index used to read from it. Attempts to read data outside the valid range leads to buffer overrun.
Code analysis name: READ_OVERRUN
Example
The following code generates this warning:
void f(unsigned int i) { char a[20]; char j; if (i <= 20) // C6385 { j = a[i]; } }
To correct this warning, use the following code:
void f(unsigned int i) { char a[20]; char j; if (i < 20) // Okay { j = a[i]; } }
See also
Avoiding buffer overruns
Я пишу код для поиска простых чисел решетом Сундарама. Использовал Динамический массив. Из-за него и проблема, я считаю:
#include <iostream>
#include <chrono>
using namespace std;
// Вывод всех простых чисел до 2n решетом Сундарама.
int main()
{
setlocale(LC_ALL, "Russian");
int n;
cout << "Введите число n:" << endl;
cin >> n;
bool* nums = new bool[n + 1]; // Объявление динамического массива.
for (int i = 1; i <= n+1; i++)
nums[i] = true; // <-- Переполнение буфера при записи в "nums":
// доступный для записи объём равен "(n+1)*1" байт, однако записать можно
// только "3" байт.
int limit = (pow(2 * n + 1, 0.5) - 1) / 2;
auto start = chrono::high_resolution_clock::now();
for (int i = 1; i < limit; i++)
{
for (int j = i; j < (n - i)/(2 * i + 1); j++)
{
nums[2 * i * j + i + j] = false;
}
}
for (int m = 1; m <= n + 1; m++)
{
if (nums[m]) cout << 2 * m + 1 << endl; // <-- Чтение недопустимых данных из "nums":
// доступный для чтения объём равен "(n+1)*1" байт,
// однако считать можно только "3" байт.
}
auto end = chrono::high_resolution_clock::now();
chrono::duration<float> duration = end - start;
cout << "Длительность выполнения алгоритма: " << duration.count() << " секунд." << endl;
delete[]nums;
nums = NULL;
}
Также просто подсчитываю время его выполнения.
В конце выполнения программы вылезает ошибка:
Debug Error!
<...>
HEAP CORRUPTION DETECTED: after Normal block (#764) at
0x008655A0.
CRT detected that the application wrote to memory after end of heap buffer.
Как понимать эти два предупреждения и Debug Error?