64-bit Coding

In what way can C++0x standard help you eliminate 64-bit errors

Programmers see in C++0x standard an opportunity to use lambda-functions and other entities I do not quite understand :). But personally I see convenient means in it that allow us to get rid of many 64-bit errors.

Consider a function that returns "true" if at least one string contains the sequence "ABC".
typedef vector<string> ArrayOfStrings;

bool Find_Incorrect(const ArrayOfStrings &arrStr)
{

Уроки разработки 64-битных приложений на языке Си/Си++

Мы регулярно пишем статьи посвященные разработке и тестированию 64-битных программ на языке Си/Си++. Каждая из статей представляет взгляд на задачу разработки 64-битных программ с разных точек зрения. Но существенная часть информации в них повторяется, так как необходимо знакомить читателя с проблематикой и вводить различные определения. Это, к сожалению, делает чтение подборки статей скучным занятием и соответственно не позволяет всесторонне изучить вопросы разработки 64-битных приложений.

Проблемы 64-битного кода в реальных программах: qsort

Продолжаем цикл рассказов о 64-битных ошибках, обнаруживаемых в реальных приложениях. Время идет, потребности в потребляемой памяти растут и пришел момент, когда кто-то решил отсортировать массив, состоящий более чем из 2^31 элементов. Для этого он решил воспользоваться функцией qsort, реализованной OpenBSD 4.5. Результатом стало обнаружение новой 64-битной ошибки.

Оптимизация в мире 64-битных ошибок

В предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случаях может работать даже явно некорректный код. Сейчас я приведу такой пример:

Тонкость с виртуальными функциями

Решил записать один момент, связанный с виртуальными функциями, а то боюсь, что потом его забуду и случайно вновь вернусь к этому вопросу. :)

В анализаторе Viva64 есть диагностика ошибок, возникающих в 64-битном коде, когда у виртуальных функций изменяется тип аргумента. Подробнее это описано в документации к продукту здесь: V301.

Вот пример кода, где анализатор выдаст эти предупреждения:
class A

{

public:

  virtual int x(unsigned) { return 1; }

Почему A + B != A - (-B)

Разрабатывая анализатор Viva64, предназначенный для поиска 64-битных ошибок, я иногда сталкиваюсь с интересными моментами поведения кода. Хочу показать один пример, который с практической точки зрения не очень интересен, но может быть полезен для понимания более сложных случаев.
char *A = "123456789";

unsigned B = 1;

char *X = A + B; // X: "23456789"

char *Y = A - (-B); // Y: <Bad Ptr>

A nice 64-bit error in C

In C language, you may use functions without defining them. Pay attention that I speak about C language, not C++. Of course, this ability is very dangerous. Let us have a look at an interesting example of a 64-bit error related to it. Below is the correct code that allocates and uses three arrays, 1 GB each:
#include < stdlib.h >

void test()
{
const size_t Gbyte = 1024 * 1024 * 1024;
size_t i;
char *Pointers[3];

// Allocate
for (i = 0; i != 3; ++i)
Pointers[i] = (char *)malloc(Gbyte);

Issues of 64-bit code in real programs: virtual functions

We have already written in our articles about one of the problems of code migration to 64-bit systems relating to incorrect overload of virtual functions. For example, our article "20 issues of porting C++ code on the 64-bit platform" was published in March, 2007 (although is still relevant). It described the issue of virtual functions. The point of the problem consists in the following. There is CWinApp class in MFC library which has WinHelp function:
class CWinApp {
...

Красивая 64-битная ошибка на языке Си

В языке Си можно использовать функции без их предварительного объявления. Обращаю внимание, что речь идет именно о языке Си, а не Си++. Конечно, данная возможность опасна. Рассмотрим связанный с ней интересный пример 64-битной ошибки. Ниже приведен корректный код, который выделяет и использует три массива размером 1 гигабайт каждый:
#include < stdlib.h >


void test()

{

  const size_t Gbyte = 1024 * 1024 * 1024;

  size_t i;

  char *Pointers[3];


  // Allocate

  for (i = 0; i != 3; ++i)

    Pointers[i] = (char *)malloc(Gbyte);


  // Use

Páginas

Assine o 64-bit Coding