Projet

Général

Profil

SOP 001-Programmation » Historique » Version 12

Patrice Nadeau, 2015-09-16 20:02

1 1 Patrice Nadeau
h1. SOP 001-Programmation
2
3
Mes standards autant au niveau du style que de la documentation.
4
5 11 Patrice Nadeau
La plate-forme (logiciel et matériel) est documenté dans le [[SOP_002-Environnement_informatique]].
6 1 Patrice Nadeau
7
{{lastupdated_at}} {{lastupdated_by}}
8
9
---
10
11
{{toc}}
12
13
h2. Diagrammes
14
15
Les représentations des différents processus d’un programme ou d’un circuit.
16
17
Les diagrammes DOIVENT être faits avec le logiciel Dia.
18
Ils PEUVENT être exportés en d’autre format.
19
20
h2. Système de gestion de version
21
22
Le logiciel "Git":http://www.git-scm.com/ DOIT être utilisé.
23
24
La version DOIT être en format: _majeur.mineur.revision_.
25
Les nombres majeur, mineur NE DOIVENT PAS contenir de zéro non significatif et DEVRAIT se limiter à deux chiffres.
26
27
Ex.
28
> Version 1.2.06
29
30
Les modifications DOIVENT se faire avec _git commit_, de la manière suivante :
31
* nom du fichier modifié,
32
* 1 espace,
33
* nom de l’item modifié entre parenthèses,
34
* un deux- points (<notextile>:</notextile>) sans espace avec l’item précédent,
35
* 1 espace,
36
* le texte du changement en anglais, commençant par une majuscule, au présent,
37
* un point (.)
38
39
Ex. :
40
> Modification ajouté manuellement
41
<pre><code class="bash">
42
git commit -m "usart.c (usart_Init): Add a new variable ctr."
43
</code></pre>
44
> Modification par un éditeur texte
45
<pre><code class="bash">
46
git commit
47
</code></pre>
48
49
Si les commit sont fait sans l’option *-m*, chaque fichier DOIT être séparé par une ligne vide.
50
51
h2. Code source
52
53
Les différents type de langage et de script décrit dans ce SOP.
54
55
h3. Généralités
56
57
h4. Langue
58
59
La langue (macros, variables, fonctions, commentaires, etc...) DOIT être l’anglais.
60
61
h4. Commentaires
62
63
Les commentaires DOIVENT être :
64
* sur la ligne précédent l’item à documenter
65
* en minuscules et commencer par une majuscule
66
67
68
h4. Nombre magique
69
70
L’utilisation de "nombre magique":http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Unnamed_numerical_constants ne DOIT PAS être utilisé directement dans le code.
71
Il DOIVENT être définis dans une macro ou une variable globale.
72
73
h2. C
74
75
Le langage C, version C99 (ISO/IEC 9899:1999) utilisé avec le compilateur GCC.
76
77
h3. Commentaires
78
79
Les commentaires ne devant pas être inclus dans une documentation, DOIVENT être de style « C » :
80
81
<pre><code class="c">
82
/* Une seule ligne... */
83
84
...
85
86
/*
87
* Sur
88
* plusieurs
89
* lignes
90
*/
91
</code></pre>
92
93
h3. Doxygen
94
95
Chaque item DOIT être documentés de manière à générer une documentation avec le logiciel "Doxygen":http://www.stack.nl/~dimitri/doxygen/index.html.
96
97
Seulement les items définis dans les fichiers d’en-tête sont documentés par défaut.
98
Un commentaire Doxygen commence par *<notextile> /** </notextile>* , le compilateur le comprenant comme un commentaire ordinaire.
99
100
Les règles typographiques du [[SOP_000-Documentation]] s’appliquent :
101
* Gras (*@b*) : Items devant être inscrit tel quel.
102
* Italique & emphase (*@e*) : Items à remplacer par un choix ou nécessitant une attention particulière.
103 10 Patrice Nadeau
104 9 Patrice Nadeau
> Doxygen version &ge; 1.8.8 : Le bogue "737472":https://bugzilla.gnome.org/show_bug.cgi?id=737472 oblige de forcer le langage de la fonction dans l’exemple si on ne veut pas de numéro de ligne.
105 1 Patrice Nadeau
106
Les items DOIVENT être inscrit dans cet ordre :
107
<pre><code class="c">
108
/**
109 6 Patrice Nadeau
* @brief Short description
110
* @param[in,out] var Description. @n Possible values :
111
* − @b value1
112
* − @b value2
113
* @return
114
* @retval @b value Description
115
* @par Example :
116 1 Patrice Nadeau
* Example Title
117 7 Patrice Nadeau
* @code{.c}
118 1 Patrice Nadeau
* ...
119
* @endcode
120
* @pre Requirements
121
* @post Changes after the call to this function
122
* @see See also ...
123
* @note
124
* @warning
125
* @bug
126
* @todo
127
*/
128
</code></pre>
129
130
Des *@todo*, *@warning* et *@bug* supplémentaires PEUVENT être ajoutés dans le code.
131
L’item *@brief* DOIT toujours exister.
132
133
h3. Code
134
135
Le code est dans le style K&R, variante 1TBS
136
* Le « tab » DOIT être équivalent à 4 espaces.
137
* Le « backslah » DOIT être utilisé pour les lignes de plus de 80 caractères.
138
* Une instruction par ligne.
139
* Un espace avant et après un opérateur sauf pour les opérateurs « "unary":http://en.wikipedia.org/wiki/Unary_operation ».
140
141
One True Brace Style
142
<pre><code class="c">
143
int fonction (void)
144
{
145
    int x;
146
    /* the comment goes here, before the loop */
147
    if (var != 1) {
148
        x = x + 1;
149
        y++;
150
        printf("This is a long\
151
        line that should be splitted");
152
    } else {
153
        /** @warning this is a Doxygen warning */
154
        x--;
155
    }
156
    return(0);
157
}
158
</code></pre>
159
160
h4. Fichier entête
161
162
Avertissement
163
>Le gabarit template.h DOIT être utilisé.
164
165
Les fichier « header » DOIVENT contenir les déclarations des fonctions, macros et la partie « mainpage » de Doxygen.
166
167
Le nom du fichier DOIT être composé de la manière suivante :
168
* en minuscule
169
* 8 caractères maximum
170
* l’extension DOIT être *.h*
171
172
Une définition macro DOIT être faite pour éviter de ré-inclure le fichier.
173
La macro DOIT être dans le format *_fichier_h*
174
<pre><code class="c">
175
#ifndef _usart_h
176
#define _usart_h
177
...
178
#endif /*_usart.h*/
179
</code></pre>
180
181
h4. Fichier source
182
183
Le nom du fichier DOIT être composé de la manière suivante :
184
* en minuscule
185
* 8 caractères maximum
186
* l’extension DOIT être *.c*
187
188
h4. Librairies
189
190
Fichiers comprenant plusieurs déclarations et définitions reliés entre eux.
191
192
* Le nom DOIT respecter les standards ([[SOP_001-Programmation#Fichiers-Entêtes|1]] & [[SOP_001-Programmation#Fichiers-Sources|2]]) et être significatifs.
193
* Un fichier d’entête DOIT toujours exister.
194
* Les items sont précédés du nom de la librairie (minuscule) et séparés par un « underscore » (_).
195
196
L’utilisation de macros DOIT être utilisé au lieu de constates globales.
197
Il NE DEVRAIT PAS exister de de variables globales.
198
199
h4. Déclarations locales
200
201
Une déclaration n’ayant qu’une visibilité locale DOIT être précédé d’un « underscore » (_) et être de classe *static*.
202
203
<pre><code class="c">
204
/**
205
* @brief Local function
206
**/
207
static void _LocalFunc(void)
208
{
209
...
210
return;
211
}
212
</code></pre>
213
214
h4. Items désuets
215
216
Les déclarations ne devant plus être utilisés, DOIVENT générer un message lors de la compilation (*-Wall*) si un appel est effectué.
217
218
L’attribut *<notextile> __attribute__((deprecated)) </notextile>* DOIT être ajouté à la déclaration.
219
La documentation DOIT indiquer les substituts à utiliser.
220
<pre><code class="c">
221
/**
222
* @brief OldFunction
223
* @detail will generate a warning if used
224
* @see @b NewFunction
225
*/
226
int OldFunction(void) __attribute__((deprecated));
227
</code></pre>
228
229
h4. Constantes
230
231
La déclaration DOIT inclure aussi la définition.
232
233
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
234
* En majuscule
235
* Séparé par un «underscore» (_) si contient plusieurs mots
236
* De classe _static_ ou _extern_ selon le besoin
237
238
<pre><code class="c">
239
/** 
240
 * @name List of constants
241
 * @{
242
 */
243
244
/**
245
* @brief Local const
246
*/
247
static int _PI = 3.15;
248
/**
249
* @brief The initialization string of the project
250
*/
251
static const char INIT_STR[6] = {'P', 'O', 'W', 'E', 'R'};
252
/**
253
* @brief Global const in the random library
254
*/
255
extern int random_MAX = 25;
256
257
/**
258
 * @}
259
 */
260
</code></pre>
261
262
h4. Typedef
263
264 12 Patrice Nadeau
Format
265
* En minuscule, suivie de *_t*
266
267
<pre><code class="c">
268
/** Unsigned integer 8 bits */
269
typedef unsigned int new_t
270
/** Type of structure in the ds1305 library */
271
typedef struct {
272
	/** @brief last two digits : &ge; 00, &le; 99 */
273
	uint8_t year;
274
	/** @brief 01 - 12 */
275
	uint8_t month;
276
	/** @brief 01 - 31 */
277
	uint8_t date;
278
	/** @brief 1 - 7 */
279
	uint8_t day;
280
	/** @brief 00 - 23 */
281
	uint8_t hours;
282
	/** @brief 00 - 59 */
283
	uint8_t minutes;
284
	/** @brief 00 - 59 */
285
	uint8_t seconds;
286
} ds1305_time_t;
287
</code></pre>
288 1 Patrice Nadeau
289
h4. Variables
290
291
Format
292
* En minuscule.
293
* Séparé par un « underscore » (_) si contient plusieurs mots.
294
295
Définition de variables
296
<pre><code class="c">
297
/** @brief Local variable */
298
int _ctr;
299
/** @brief Global variable from the random librairy */
300
int random_ctr;
301
</code></pre>
302
303
h4. Structures
304
305
Format
306
* En minuscule, séparé par des «underscores» si nécessaire.
307
308
Définition de structures
309
<pre><code class="c">
310
/**
311
* @brief Structure for a local menu
312
* @see MenuSelect
313
*/
314
struct menu {
315
/** @brief Character used for the item */
316
char choice;
317
/** @brief Description of the item */
318
char *item;
319
};
320
</code></pre>
321
322
h4. Fonctions
323
324
Le nom est formé d’une lettre majuscule pour chacune des premières lettres des mots.
325
326
Le nom DOIT être dans un deux formats suivants :
327
* ActionItemAttribut, où _Action_ signifie :
328 5 Patrice Nadeau
** *Get* : Lis un registre
329
** *Read*, *Write* : Lis ou écris dans un fichier
330
** *Set* : Écris une valeur prédéfini dans un registre
331
** *Init* : Fonction d’initialisation
332 1 Patrice Nadeau
* isItemEtat
333 5 Patrice Nadeau
** *is* : Verifie si _Item_ est dans l’état _Etat_
334 1 Patrice Nadeau
335
Exception
336
> Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver »). Dans ce cas, le nom définis dans le « datasheet » aura préséance. Ex. ReadRegister.
337
338
Une fonction DEVRAIT retourner une valeur. 
339
340
Dans le cas d'un « oui/non », la valeur DOIT être :
341
* Succès : *0* 
342
* Erreur : *1*
343
> L'utilisation d'un type booléen (*true* & *false*) est permise avec *<stbool.h>* (C99).
344
345
Dans le cas d'une fonction retournant un pointeur :
346
* Erreur : *NULL* 
347
* autre valeur  : adresse du pointeur
348
349
350
Définition de fonctions
351
<pre><code class="c">
352
/**
353
* @brief Check if a timer is set
354
* @param[in] nb Timer number. @n Possible values :
355
* − @b TIMER_1
356
* − @b TIMER_2
357
* @return
358
* @retval true Timer @e nb is set
359
* @retval false Timer @e nb is NOT set
360
* @par Example :
361
* Check if the timer is set
362
* @code{.c}
363
* ...
364
* result = isTimerSet();
365
* ...
366
* @endcode
367
* @pre TimerInit
368
**/
369
static bool isTimerSet(uint8_t nb);
370
/**
371
* @brief Set the led to green
372
**/
373
SetLedColor(GREEN);
374
/**
375
* @brief Set register of the chip XYZ
376
*
377
* The name does not follow the standards but does match the datatsheet
378
* This is a local function not meant to be called outside this librairy
379
**/
380
static void _WriteReg(void);
381
</code></pre>
382
383
h3. Macros
384
385
Les directives du préprocesseur C.
386
387
* Utilisé dans le code source et les fichiers entête.
388
* DOIT toujours commencer à la colonne 0.
389
390
h4. include
391
392
Pour inclure d’autres fichier comme les fichiers entête.
393
>N’est pas documenté dans Doxygen.
394
395
h4. ifdef / ifndef
396
397
Surtout utiliser pour des options de compilation sur différentes plateforme.
398
>N’est pas documenté dans Doxygen.
399
400
<pre><code class="c">
401
#ifndef usart_AVR
402
#error "usart.h is not supported on this AVR !"
403
#endif
404
</code></pre>
405
406
h4. error
407
408
Affiche une erreur et arrête la compilation
409
>N’est pas documenté dans Doxygen.
410
411
<pre><code class="c">
412
#ifndef __test__
413
#error "Error !"
414
#endif
415
</code></pre>
416
417
h4. #warning
418
419
Affiche une erreur mais n’arrête la compilation
420
>N’est pas documenté dans Doxygen.
421
422
<pre><code class="c">
423
#ifndef __test__
424
#warning "Warning !"
425
#endif
426
</code></pre>
427
428
h4. define 
429
430
Définis une valeur au moment de la compilation.
431
* Format
432
** En majuscule.
433
** Séparé par un «underscore» si contient plusieurs mots.
434
* Doxygen
435
** @brief
436
** @name pour les listes de macros (regroupement dans la documentation)
437
438
Définition de macros
439
<pre><code class="c">
440
/**
441
* @name Mathematical macros listed together
442
* @{
443
*/
444
/** @brief Value for PI */
445
#define _PI 3.14
446
/** @brief Another number */
447
#define _MAGIC_NUMBER 42
448
/**
449
* @}
450
*/
451
/** @brief Even parity */
452
#define usart_PARITY_EVEN 'e'
453
</code></pre>
454
455
h3. Atmel AVR
456
457
Particularités pour les micro-contrôleurs AVR d’Atmel.
458
459
* Progmem : Pour mettre une fonction en Flash au lieu de SRAM.
460
** Le nom de la fonction est suivie de *_P*.
461
* main : Ne revient jamais à un niveau supérieur.
462
** Définir la fonction main avec l’attribut *noreturn*.
463 3 Patrice Nadeau
** La boucle sans fin la plus optimisé est le *for (;;)*.
464 1 Patrice Nadeau
* Atomic : Opérations ne devant pas être interrompus.
465
466
Particularités pour AVR
467
<pre><code class="c">
468
/**
469
* @brief Progmem function
470
* @return An unsigned 8 bits integer
471
*/
472
uint_8t PrintString_P()
473 4 Patrice Nadeau
474 1 Patrice Nadeau
/* main function */
475
void main(void) __atribute__((noreturn))
476
{
477
    ...
478
    /* never return */
479
    for (;;) {
480
    }
481
}
482
483
/* atomic operations */
484
#ifndef S_SPLINT_S
485
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
486
/* 
487
* operations that must not be interupted
488
* like loading a 16 bit register with a 8 bit register 
489
*/
490
}
491
#endif
492
</code></pre>
493
494
h3. Distribution
495
496
Les fichiers suivants DOIVENT être inclus dans une distribution en format *tar.gz*.
497
* ChangeLog
498
* README
499
* Files.lst
500
* Makefile
501
* Makefile.mk
502
* LICENSE.txt
503
* *.c
504
* *.h
505
* projet.pdf (généré par Doxygen)
506
507
Avec mon makefile :
508
<pre><code class="bash">
509
make dist
510
</code></pre>
511
512
h3. Modifications
513
514
Un changement à un fichier (source ou en-tête), doit se refléter dans _Git_.
515
516
Chaque changement est fait avec :
517
<pre><code class="bash">
518
git add nom_fichier
519
git commit
520
</code></pre>
521
522
La ligne DOIT 
523
* être au temps présent
524
* être en anglais
525
* se termine par un point
526
* être dans le format suivant :
527
> La partie _section_ est facultative
528
529
<pre><code class="text">
530
fichier1 (fonction) <section>: 
531
Ajoute une description au temps présent.
532
Décrire les bogues réglés si il y en avaient.
533
</code></pre>
534
535
h3. Changelog
536
537
La somme de toutes les modification doivent apparaitre dans un fichier « changelog ».
538
> Le standard seras celui GNU : http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
539
540
Ce fichier doit s'appeler *ChangeLog* et DOIT être généré à partir de _Git_ (les doubles espaces ne sont pas une erreur de frappe :
541
<pre><code class="bash">
542
git log --no-merges --format="%ad  %an  <%aE> %n * %B" --date=short > ChangeLog
543
</code></pre>
544
545
h3. Validation du code
546
547
Le logiciel _splint_ est utilisé.
548
* Un « typecast » DOIT être utilisé lorsque détecté.
549
* L’utilisation du typecast *void* DOIT être utilisé lorsque qu’une fonction retourne un résultat non utilisé.
550
551
h2. Makefile
552
553
h2. Nagios
554
555
h3. Plugins
556
557
https://nagios-plugins.org/doc/guidelines.html
558
559
Un message d'une ligne (< 80 caractères) DOIT être retourné via _STDOUT_ dans le format
560
> *SERVICE STATUS:* texte
561
562
Les codes de retour sont les suivants:
563
|_. Valeur |_. Service Status |_. Description |
564
| 0 | OK | Le service fonctionne |
565
| 1 | Warning | Le service fonctionne, problème avec le seuil de la valeur _Warning_ |
566
| 2 | Critical | Le service ne fonctionne pas ou problème avec le seuil de la valeur _Critical_  |
567
| 3 | Unknow | Arguments non valides ou erreur interne (fork, tcp socket)|
568
569
Les arguments suivants DOIVENT être fournis
570
* *-H* (*--hostname*) :
571
* *-w* (*--warning*) :
572
* *-c* (*--critical*) :
573
* *-V* (*--version*) :
574
* *-h* (*--help*) :
575
576
L'argument _--help_ DOIT aussi appeler l'argument _--version_.
577
578
En _C_, les fonctions suivantes DOIT être utilisées :
579
* _print_revision_ (utils.c)
580
* _print_help_
581
* _getopt_long_ (getopt.h)
582
583
h2. Puppet
584
585
h3. Généralités
586
587
Inspiré des recommandations disponible au http://docs.puppetlabs.com/guides/style_guide.html.
588
* Tabulation : 2 espaces
589
*  Largeur : 80 caractères (« backslah » (\) pour séparer une longue ligne).
590
* Commentaires : Style #
591
* Guillemets
592
** Simple : Pour une « string » sans variables.
593
** Double : Pour une « string » avec variables ayant besoin d’être extrapolé.
594
*** La variable doit être entourée des symboles *<notextile>{</notextile>* et *<notextile>}</notextile>*.
595
* Nom des ressources : DOIVENT être entouré du symbole *<notextile> ’ </notextile>*.
596
* Alignement de => : DOIT être aligné dans un même paragraphe.
597
* Ordre : Si l’attribut _ensure_ doit être inclus, il DOIT être le premier.
598
* Lien symbolique : DOIT être déclaré avec *ensure => link*
599
600
Ex. :
601
<pre><code class="ruby">
602
file { '/var/log/syslog':
603
ensure => link,
604
target => '/var/log/messages',
605
}
606
</code></pre>
607
608
* File mode : 
609
** 4 chiffres
610
** simple guillemet
611
* Variables
612
** lettres
613
** chiffres
614
** « underscore »
615
616
h3. Documentation
617
618
http://docs.puppetlabs.com/learning/modules2.html#module-documentation
619
620
Format Rdoc (http://rdoc.rubyforge.org/RDoc/Markup.html)
621
* Bloc de commentaires qui commence sur la première ligne du fichier
622
* Titre avec le symbole *<notextile>=</notextile>*
623
* Séparation avec le symbole *<notextile>-</notextile>*
624
* Emphase (mot entouré du symbole)
625
** * : gras
626
** _ : souligné
627
** + : Police de caractères pour le code
628
* Sections
629
** = Class:
630
** == Parameters:
631
** == Requires:
632
** == Sample Usage:
633
* Classe
634
** Une classe par fichier « manifest »
635
636
h2. Script
637
638
h3. Bash
639
640
<pre><code class="bash">
641
#/bin/bash
642
643
function print_revision {
644
}
645
646
function print_help {
647
    print_revision
648
}
649
</code></pre>
650
651
h3. Perl
652
653
<pre><code class="perl">
654
655
</code></pre>
656
657
h3. PowerShell
658
659
Version 4.0. Supporte :
660
* Windows 8.1 (natif)
661
* Windows Server 2012 R2 (natif)
662
* Windows 7 SP1
663
* Windows Server 2008 R2 SP1
664
* Windows Server 2012
665
666
h4. Fichier
667
668
Le fichier DOIT être composé de la manière suivante :
669
* L’extension est .ps1
670
* Une longue ligne peux être séparée avec un « back tick » (‘).
671
672
h4. Commentaires
673
674
L’aide est accéder par _Get-Help_
675
<pre>
676
#REQUIRES -Version 2.0
677
<#
678
.SYNOPSIS
679
A brief description of the function or script.
680
This keyword can be used only once in each topic.
681
.DESCRIPTION
682
A detailed description of the function or script.
683
This keyword can be used only once in each topic.
684
.NOTES
685
File Name
686
: xxxx.ps1
687
Author
688
:
689
Prerequisite
690
: PowerShell V2 over Vista and upper.
691
Copyright 2011 -
692
.LINK
693
Script posted over:
694
http://
695
.EXAMPLE
696
Example 1
697
.EXAMPLE
698
Example 2
699
#>
700
</pre>
701
702
h2. Vim
703
704
* Entête (en commentaires)
705
** Titre
706
** Last Change:
707
** Maintainer:
708
** License: This file is placed in the public domain.
709
* Autre mots reconnus
710
** BUG: (Error:)
711
** TODO:
712
** Note:
713
** FIXME
714
715
h2. Références
716
717
Références ayant servis à ce document.
718
719
"ChangeLog":http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
720
"GNU deprecated attribute":http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html