f0rbidik
0
Ближайшее обновление будет посвящено именно этой проблеме.
f0rbidik
0
А что, Вы, простите, делаете? Детектируете такие вот «ошибки»?
f0rbidik
–1
Вы серьезно?

image
f0rbidik
+3
А вот если она разная то сервер Telegram может подобрать такую nonce, при которой ключи пользователей совпадут даже при MITM-атаке и никто не будет знать, что его слушают. И даже если nonce совпадает для 2х собеседников сегодня, нет никаких гарантий что nonce будет совпадать завтра, когда в офис Digital Fortress придет АНБ / ФСБ / другая не хорошая организация.

Может подобрать? Если nonce для клиентов — разный, то сервера Telegram и есть MITM, знающий secret_key, иначе ключи на клиентах не совпадут.

P.S. Николай W_K, сорвите покрова: разный был nonce для клиентов или же нет?

Если одинаковый, то какой от него был толк? А если же разный, то, как так вышло, что разработчики «не заметили», что сервер в процессе генерации узнает secret_key и компрометирует DH?
f0rbidik
–1
Не составит труда? Пруфы или не было (unixtime не в счет).
f0rbidik
0
Для перегрузки методов родительских классов «внутри» потомка при множественном наследовании достаточно ввести имена методов родительских классов в class scope класса-потомка.

class Human: public O<Human, Dog>, O<Human, Cat>
{
public:
    using O<Human, Dog>::Setlink;
    using O<Human, Cat>::Setlink;
};
f0rbidik
0
Прошу прощения, смотрите комментарий ниже.
f0rbidik
0
Я поясню свой вопрос: выбирая наименьшее значение из текущего и следующего приближений, в случае если вы выбираете начальное приближение < sqrt(x), алгоритм вернёт его же после произвольного числа итераций.
f0rbidik
+1
основной алгоритм:
sqrt_eval(p, res, x) {
t1 = x/res
t2 = res+t1
tmp = t2/2
less_val = tmp < res? tmp: res
if (p-1 == 0)
return less_val;
return sqrt_eval(p-1, less_val, x)
}
С какой целью выбирается наименьшее значение?
f0rbidik
0
Господа, приношу свои извинения! В заблуждение ввело то, каким образом могут обрабатываться строковые литералы:

char c = *"Brown fox jumps over the lazy dog";

Отдельные извинения для Andrey2008! Не сразу обратил внимание, что приведённый макрос предлагается использовать для литералов.
f0rbidik
–2
Ещё один. С чего вы взяли, что я не знаю как работает оператор sizeof?
Суть моих ответов сводится к тому, что НЕВОЗМОЖНО определить длину строки at compile time, что безуспешно пытается сделать уважаемый Andrey2008. Это можно сделать только at run-time, к примеру, с помощью strlen.
f0rbidik
0
По-моему вы чересчур преисполнены самомнением для человека, который для вычисления длины строки советует использовать макрос
#define STRLEN(s) (sizeof(s)/sizeof(*s) — 1)
Я поясню свои вопросы: (Null Terminator) '\0' — маркер окончания последовательности символов, хранящихся в памяти и составляющих данную строку. Таким образом длину строки, хранящейся в памяти, можно определить как разность смещений начала строки и терминального нуля, относящегося к данной строке.
Для препроцессоров компиляторов C/C++ строка является единым токеном, поэтому невозможно вычислить длину строки at compile time, используя macro expansion trickery.
Как бы я реализовал «вычисление длины пути хорошо»? Пожалуй что так.
f0rbidik
–3
Мы на разных языках говорим? Зачем по-вашему '\0' помещают в конец строки?
f0rbidik
–5
По-вашему терминальный нуль просто так придумали?
f0rbidik
+20
Разработчики Intel тоже говнокодят
… можно было бы завести для этого вот такой макрос "#define STRLEN(s) (sizeof(s) / sizeof(*s) — 1)"

Стоит ожидать топика?
Разработчики PVS-Studio тоже говнокодят

f0rbidik
–1
Разработчики Intel тоже говнокодят

f0rbidik
+2
// Primary template
template<class T>
  class A {};

template<class T1, class T2>
  class B {};

// A's partial specialization
template<class T1, class T2>
  class A<B<T1, T2> > {};
f0rbidik
0
unsigned long long getNsec(unsigned long long ticks) {
    static const unsigned long long _GCD_TPS_NSPS = gcd(NSEC_PER_SECOND, TICKS_PER_SECOND);
    return ticks * (NSEC_PER_SECOND / _GCD_TPS_NSPS) / (TICKS_PER_SECOND / _GCD_TPS_NSPS);
};


f0rbidik
–1
Не проще ли один раз посчитать TICKS_PER_NSEC?
f0rbidik
0
Каким образом, в таком случае, вы получаете little-endian из big-endian?
f0rbidik
0
Внимательно перечитайте первый комментарий вышележащей ветки.
f0rbidik
0
Неверно: виртуальное наследование предотвращает репликацию субобъекта виртуального базового класса для объектов наследующих классов, являющихся, в свою очередь, субобъектами базовых классов для объекта их общего класса-наследника.
f0rbidik
0
Комментарий относится, к вышележащей ветке.
f0rbidik
0
Вас не смущает, что приведённая вами реализация работает неверно?
f0rbidik
+1
Это означает, что BE и LE-платформами данные будут интерпретироваться по-разному:

unsigned char raw[4] = {}; raw[3] = 1;

// Big-endian platform (ex. MAC OS X on PPC) output: 1
// Little-endian platform (ex. MAC OS X on PPC) output: 16777216
std::cout << *((__int32 *) &raw) << "\n";
f0rbidik
+2
Представление данных в памяти не зависит от манеры интерпретации их средой исполнения: конструкторы для классов BigEndian и LittleEndian должны реализовывать семантику побайтового копирования:

LittleEndian::LittleEndian(const T * p) {
  const unsigned char * pc = (const unsigned char*) p;
  for (unsigned i = 0; i < sizeof(T); i++)
    bytes[i] = *pc++;
};

BigEndian::BigEndian(const T * p) {
  const unsigned char * pc = (const unsigned char*) p;
  for (unsigned i = 0; i < sizeof(T); i++)
    bytes[i] = *pc++;
};


А операторы приведения иметь, соответственно вид:

LittleEndian::operator const T() const {
      return raw_value;
}

BigEndian::operator const T() const {
      return raw_value;
}
f0rbidik
+2
Во-первых, ваш код платформозависим: он работает не на уровне представления данных в памяти а на уровне интерпретации данного представления средой исполнения. Соответственно, на BE платформах он работать не будет.

Во-вторых, ваш код не позволяет пребразовать BE в LE (или наоборот):

#include <iostream>
int main() {
  
  unsigned char be_unit[4] = {}; be_unit[3] = 1;

  BigEndian<int> be(*((int *) &be_unit));
  LittleEndian<int> le(be);

  std::cout << (int) be << "\n";  // 16777216
  std::cout << (int) le << "\n";   // 16777216

};


Во-третьих, endianness определяет порядок индивидуально адресуемых единиц в машинном слове: ваш код для целых занимающих более одного слова будет работать неверно.
f0rbidik
+1
При этом функция возвращает массив из элементов 'char' длиной N.

Функция возвращает ссылку на массив.
f0rbidik
+1
Неверно толкуете стандарт. Этот пункт говорит о том, что поведение не определено в следующем случае:

struct A {};

void foo() { static A a; };

struct B {
  ~B() { foo(); };
};

void main() {

  static B b;
  foo();

};
f0rbidik
0
Подписаны C/C++ incompatibilities. Этот код компилируется С99 компилятором, но содержит 2-е ошибки. Чем не вопрос на собеседовании?
f0rbidik
+1
Вы не видите разницы между method overloading и method overriding?

Не изображайте из себя жертву: если на то пошло, то я высказываю не собственное «мнение», а «мнение» Christopher Strachey, John Reynolds, и иже с ними. Признавать или не признавать их идеи — ваше право. Однако используя общепринятую терминологию в собственных целях вы вводите людей в заблуждение и только.
f0rbidik
0
In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface.



  1. Ad-hoc polymorphism: If the function denotes different and potentially heterogeneous implementations depending on a limited range of individually specified types and its combination, it is called ad-hoc polymorphism. Ad-hoc polymorphism is supported in many languages using function and method overloading.

  2. Parametric polymorphism: If all code is written without mention of any specific type and thus can be used transparently with any number of new types, it is called parametric polymorphism.

    In the object-oriented programming community, programming using parametric polymorphism is often called generic programming.

  3. Subtype polymorphism: In object-oriented programming, subtype polymorphism or inclusion polymorphism is a concept in type theory wherein a name may denote instances of many different classes as long as they are related by some common super class.


http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
f0rbidik
+2
Статический полиморфизм или compile-time polymorphism это то, что предлагают шаблоны функций/классов (class/function templates).
f0rbidik
+1
В вашем примере пункта #14 полиморфизма нет. Есть method overriding.
f0rbidik
+2
// main.c

main()  /* poor style C. Not C++ */
{
double sq2 = sqrt(2);                         /* call undeclared function */
printf("the square root of 2 is %g\n", sq2);  /* call undeclared function */
}
f0rbidik
+1
6. Как защитить объект от копирования?

Ответ: Сделать private конструктор копирования и оператор =.

Так вы защититесь только от копирования извне, но сможете копировать в членах класса. Нужно не просто делать их приватными, но ещё и оставлять без реализации.


В членах и friend'ах.
f0rbidik
+2
Нельзя определять вложенные функции. Объявлять можно.

// main.cpp

int foo(int bar) { return bar; };

int main() {

  extern int foo();

  return foo();

};


// foo.cpp

int foo() { return 0; };