В ядре Linux была обнаружена еще одна уязвимость безопасности, связанная с получением root-доступа из пользовательской наземной программы. Основной причиной является аргумент size_t, передаваемый как (подписанный) int. Это заставляет людей клеветать на C за то, что он небезопасен, нестабилен и ненадежен, и все это правда. Но я чувствую себя обязанным защищать пожилых людей во всем, особенно когда речь идет о языках программирования, и поэтому я сделаю это здесь. Ваша логика может отличаться.

На мой взгляд, параметр с именем «buflen» должен никогда, никогда, никогда иметь подписанный тип. Слышишь, Линус? Лучше погуглите. Почему? Длина никогда не может быть отрицательным значением, только нулем. Так почему же любой здравомыслящий API принимает -1 в качестве допустимой длины? Конечно, когда я говорю это в таких простых выражениях, это может показаться очевидным. Я уверен, что автор этого фальшивого API никогда не согласится с утверждением вроде «длина может быть отрицательной». И тем не менее... именно это вы имеете в виду, когда пишете:

char *dentry_path(struct dentry *dentry, char *buf, int buflen)

О боже, глазам больно просто смотреть на это. Советую пролистать для собственного потомства, дорогой читатель. Такие оскорбления не место в ЦИВИЛИЗИРОВАННОМ обществе. Конечно, правильно написать это с помощью size_t buflen, и тогда у нас не будет этой проблемы, и тогда Twitter не будет коллективно прыгать вокруг костра, сжигая конечности C в чучеле, и тогда я мог бы немного поспать в ночь. Ну, не с тех пор, как я купила эту странную куклу в комиссионном магазине. У нее была бирка с надписью «Аннабель» или что-то в этом роде.

Это должно быть стандартом на каждом собеседовании по разработке встраиваемых систем или ядер, как это было со мной. Я получил баллы за то, что указал на это во время одного из них. К сожалению, все, что я получил, это новая работа и никаких бесплатных пирожных в поле зрения. Наверное, я виню… людей, преподающих C? Да, вы знаете, что это правильно, низкооплачиваемая основа мира «введения в CS». Это ваша вина, а не мой любимый артефакт Bell Labs, который бесценен (ну, «цена» здесь — целое число). Почему каждый учебник по C и даже опубликованная книга начинаются с некоторого «int x», если вы никогда не видите присвоенных отрицательных значений? K&R, возможно, справочник поC, на странице 18:

long nc;
nc = 0;
while (getchar() != EOF)
    ++nc;

Как странно, что K&R думал, что использование чуть более эффективного оператора предварительного приращения важнее, чем использование правильного типа. Особенно новичкам. У nc меньше дел с "долгой", чем у меня в магазине спортивных товаров (последним видом спорта, в который я играл, был Temple Run 2). Я понимаю: в «int» меньше символов, и вы не хотите отпугивать новичков, используя такие заклинания, как «unsigned» или «size underscore t». Однако я думаю, что учителя C забывают один ключевой факт:

Заложная аудитория.

Ни у кого, изучающего C, действительно нет выбора. Либо они сдают CS 101, либо ищут работу и хотят добавить дополнительный тег в поле «навыки». Поскольку они находятся между молотом и наковальней, вы можете научить их чему угодно. Я не предлагаю начинать с char (*(*x())[5])() (хотя какой мощный MOV это будет), но, может быть, заранее указать, что… типы… имеют… значения? было бы неплохо. Может быть, просто может быть, в надежде на звезду, это предотвратило бы создание таких проблем, как ошибка ядра Linux, в первую очередь. Может быть, мы могли бы даже переломить ситуацию с «int по умолчанию», что, безусловно, является одной из худших тенденций в информатике. Во-вторых, все добавляли в текст лицензии подробные художественные портреты покойного короля «Берти» Эдуарда VII в формате ASCII. (Нет? Это был только я?)

Хотя, конечно, гораздо проще обвинить C. Черт тебя побери, Деннис Ричи!